WaitForSingleObject函数
DWORD WaitForSingleObject(
HANDLE hHandle, //内核对象的句柄,如线程、进程、互斥体等等的句柄。
DWORD dwMilliseconds) //等待的时间,单位为毫秒。
注:调用WaitForSingleObjec函数之后,就会阻塞到这里(通俗点说,代码就停到这里,什么时候执行,要看第一个参数 hHandl 这个对象什么时候变成已通知,或者 第二个参数 等待时间超时,如果第二个参数是-1(INFINITE)的话,那么就会一直等待到第一个参数变为已通知)。
当:WaitForSingleObjec变为已通知状态后,代码就往下执行了,那么再次把这个对象置为未通知状态(尤其值得注意的是,线程和进程是特殊状态,他往下执行,不会改变状态)。
返回值:
WAIT_OBJECT_0(0) //等待的这个对象变为已通知了。
WAIT_TIMEOUT(0x102)//等待时间超时。
WaitForMultipleObjects函数
DWORD WaitForMultipleObjects(
DWORD nCount, //需要等待几个对象
CONST HANDLE *lpHandles, //多个对象的数组指针。
BOOL bWaitAll, //是否是等待所有?
DWORD dwMilliseconds //等待时间 毫秒。
)
返回值:
bWaitAll为TRUE时,返回值为WAIT_OBJECT_0(0)时, //等待的所有对象变为已通知了。
bWaitAll为FALSE时,返回最先变成已通知的内核对象在数组中的索引。
WAIT_TIMEOUT(0x102)//等待时间超时。
互斥体:
互斥体也是一个内核对象,用CreatMutex函数来创建一个互斥体.
HANDLE CreatMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, //权限控制,一般为NULL;
BOOL bInitalOwner , //TRUE
LPCTSTR lpName , //互斥体的名字,便于跨进程查找。
)
代码示例:创建一个名字为XYZ的互斥体。
HANDLE g_hMutex =CreatMutex(NULL,FALSE,"XYZ");
//以下两句代码是成对的, 在中间填写需要互斥的代码。
WaitForSingleObject(g_hMutex,-1);
//需要执行的代码。
releaseMutex(g_hMutex);
互斥体与临界区的区别:
1.临界区只能用于单个进程间的线程控制;
2.互斥体可以设定等待超时,但是临界区不行;
3.线程意外终结时,Mutex可以避免无限等待;
4.Mutex没有临界区效率高。