今天突然有一同事问到waitforsingleobject 的用法,还有createthread(),下面随便写一下.纯粹是想到什么写什么,如果说写错了请指正.
waitforsingleobject ()里面有两参数,一个是HANDLE,一个是时间,至于这个HANDLE可以是Thread,event等,记得在写键盘驱动的时候就用到这个,当时是要创建一个事件如:
HANDLE gWaitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);这个就可以在下面用
DWORD ret=WaitForSingleObject(gWaitEvent,INFINITE );等待.其实这个的用法有很多种,还可以用SetEvent(HANDLE)来传信号量,看个人的习惯怎么用了.
还有一个就是线程同步问题,其实同步也有几种方法,临界区,互斥,信号,事件......
下面就是一个用临界区实现线程同步的例子:
下面的是线程1运行完了,线程2运行,线程2运行线程3运行
#include "stdafx.h"
#include "stdio.h"
#include <windows.h>
CRITICAL_SECTION gs;
DWORD WINAPI helloFunc(LPVOID arg){
int i;
::EnterCriticalSection(&gs);//进入临界区
int *N =(int*)arg;
for(i = 0; i <18;i++)
{
printf("Thread %d run in %d/n",*N,i+1);
}
::LeaveCriticalSection(&gs);//退出临界区
ExitThread(0);
return 0;
}
int main(int argc, char* argv[])
{
::InitializeCriticalSection(&gs);//初始化临界区对象
HANDLE thread[3];
int x = 0,y = 1,z = 2;
thread[0] = CreateThread(NULL,0,helloFunc,&x,0,NULL);
thread[1] = CreateThread(NULL,0,helloFunc,&y,CREATE_SUSPENDED ,NULL);
thread[2] = CreateThread(NULL,0,helloFunc,&z,CREATE_SUSPENDED ,NULL);
::WaitForSingleObject(thread[0],INFINITE);
ResumeThread(thread[1]);
::WaitForSingleObject(thread[1],INFINITE);
ResumeThread(thread[2]);
::WaitForSingleObject(thread[2],INFINITE);
::CloseHandle(thread[0]);
::CloseHandle(thread[1]);
::CloseHandle(thread[2]);
return 0;
}