好文档 - 专业文书写作范文服务资料分享网站

Windows多线程编程_C语言

天下 分享 时间: 加入收藏 我要投稿 点赞

Windows多线程编程-C语言

先上代码:

#include

#include// for HANDLE

#include// for _beginthread() #include

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(\); DWORD ExitCode; //线程退出码 GetExitCodeThread(hth1, &ExitCode); //获取线程退出码,因为刚刚创建,所以

//肯定还未退出,此时的退出码应为259,表示STILL_ACTIVE

printf(\线程未退出\\n\, ExitCode); ResumeThread(hth1); // 激活线程 WaitForSingleObject(hth1, INFINITE);//等待线程结束 GetExitCodeThread(hth1, &ExitCode);//获取线程退出码 printf(\, ExitCode, Thread1ID,hth1);

CloseHandle(hth1);//关闭句柄 system(\); 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(); //需要头文件

六、线程间的通信方式有:全局变量、参数传递

七、如果入口函数的参数不止一个时,可以使用类的思想去解决,比如把某个类的静态函

数用来做线程入口函数,把这个类的对象作为入口函数的参数。

李茂福 2018.01.01

Windows多线程编程_C语言

Windows多线程编程-C语言先上代码:#include#include//forHANDLE#include//for_beginthread()#includeunsigned__stdcallthrea
推荐度:
点击下载文档文档为doc格式
3akgn30kdx9bpag891bi6tck19hq4z003g1
领取福利

微信扫码领取福利

微信扫码分享