Windows多线程编程-C语言
先上代码:
#include<stdio.h>
#include<windows.h>// for HANDLE 
#include<process.h>// for _beginthread() 
#include<stdlib.h>
unsigned__stdcall thread(void * i)  //子线程入口函数
{
    int * k = (int *)i;
    printf("这是子线程%d\n", *k);
    return 1;              // the thread exit code 
}
int main()
{
    HANDLE  hth1;//子线程句柄
    unsigned  Thread1ID;//子线程ID
    int i = 1;//子线程入口函数参数
   
    //创建子线程
    hth1 = (HANDLE)_beginthreadex(NULL,    // security,安全属性
        0,            // stack size 
        thread,      //子线程入口函数
        &i,          // arg list  入口函数参数地址
        CREATE_SUSPENDED,  //先挂起该线程
        &Thread1ID);//线程标识符
    if (hth1 == 0)//如果返回的hth1的值为0 则表示创建子线程失败
        printf("Failed to create thread 1\n");
    DWORD  ExitCode; //线程退出码
    GetExitCodeThread(hth1, &ExitCode);  //获取线程退出码,因为刚刚创建,所以
//肯定还未退出,此时的退出码应为259,表示STILL_ACTIVE
    printf("initial thread 1 exit code = %u线程未退出\n", ExitCode);
    ResumeThread(hth1);  // 激活线程
    WaitForSingleObject(hth1, INFINITE);//等待线程结束
    GetExitCodeThread(hth1, &ExitCode);waitforsingleobject函数//获取线程退出码
    printf("thread 1 exited with code %u,its pid=%u,its handle=%d\n", ExitCode, Thread1ID,hth1);
    CloseHandle(hth1);//关闭句柄
    system("pause");
    return 0;
}
编译环境为vs2010 运行结果:
开始解释:
一、用C语言在Windows下进行多线程编程,需要用到CreateThread()函数,该函数原型:
HANDLE CreateThread ( LPSECURITY_ATTRIBUTES  lpThreadAttributes,  //参数1
DWORD  dwStackSize,  //参数2
LPTHREAD_START_ROUTINE  lpStartAddress,  //参数3
LPVOID  lpParameter,  //参数4
DWORD  dwCreationFlags,  //参数5
LPDWORD  lpThreadID  //参数6
                  )
参数1:线程安全属性,默认为NULL,表示线程返回的句柄不能被子线程继承
参数2:线程堆栈初始大小,一般设为0(使用系统默认值)
参数3:线程入口函数的起始地址
参数4:线程入口函数的参数,以指针方式传入,NULL表示无参数
参数5:创建线程的方式,表示创建线程后是先挂起还是立即执行(CREATE_SUSPENDED为先挂起,0 表示立即执行)
参数6:线程标识符,由操作系统设置
二、对于使用C运行库里的函数的线程,一般不直接使用CreateThread()函数来创建,而是使用 _beginthreadex() ,用这个会更安全,该函数的参数与CreateThread()的是一样的。
三、线程和线程句柄Handle 不是一个东西,线程句柄的生命周期和线程的生命周期不一样,我们可以通过线程句柄来操作线程,如挂起、激活、改变优先级等。关闭了句柄并不关闭线程。
相关函数:
ResumeThread(线程句柄)  //激活线程
SuspendThread(线程句柄)  //挂起线程
WaitForSingleObject(线程句柄,等待方式)  //等待线程结束,等待方式为INFINITE时,表示永远等待下去,直到线程结束;等待方式为数字时,表示等待该线程的时间,单位为ms,到了时间就结束该线程。
注:如果某些线程挂起而未激活,使用WaitForSingleObject()函数时会导致死锁
CloseHandle(线程句柄)  //关闭线程句柄(当不需要对线程进行干预时)
句柄在线程结束后一定要记得关闭,不然系统的句柄资源很快就用完了。
四、__stdcall是函数调用约定的一种,表示标准调用。在Win32应用程序里,宏APIENTRY
WINAPI 都表示 __stdcall ,_beginthreadex()线程入口函数必须使用 __stdcall调用约定。
五、获取当前进程的pid 可使用_getpid()函数,例  int pid = _getpid();    //需要头文件
<process.h>
六、线程间的通信方式有:全局变量、参数传递
七、如果入口函数的参数不止一个时,可以使用类的思想去解决,比如把某个类的静态函数用来做线程入口函数,把这个类的对象作为入口函数的参数。
李茂福
2018.01.01

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。