版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/itworld123/article/details/81365998
2018-08-02 创建人:Ruo_Xiao
参考链接:
1、https://blog.csdn.net/scliu12345/article/details/8703254
2、https://baike.baidu.com/item/WaitForSingleObject/3534838
邮箱:[email protected]
一、介绍
- 形参
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
- Windows API函数。
二、功能
- 监控hHandle事件的信号状态。
- 当 dwMilliseconds > 0 时,该函数处于堵塞状态,直至hHandle标记的对象被触发。
- 当 dwMilliseconds = 0 时,不管hHandle标记的对象是否被触发,该函数都会立刻返回。
- 当 dwMilliseconds = INFINITE(0xFFFFFFFF) 时,该函数会一直堵塞,直至hHandle标记的对象被触发。
- 由于dwMilliseconds 为DWORD型,即:unsigned long,故没有小于0的值。
三、返回值
- WAIT_ABANDONED(0x00000080):当hHandle为mutex时,如果拥有mutex的线程在结束时没有释放核心对象会引发此返回值。
- WAIT_OBJECT_0( 0x00000000):指定的对象出有有信号状态。
- WAIT_TIMEOUT(0x00000102):等待超时。
- WAIT_FAILED (0xFFFFFFFF):出现错误,可通过GetLastError得到错误代码。
四、实例
#include <windows.h>
#include "windef.h"
#include <iostream>
using namespace std;
DWORD WINAPI Thread1(LPVOID lpParmeter);
DWORD WINAPI Thread2(LPVOID lpParmeter);
static HANDLE g_hMutex = INVALID_HANDLE_VALUE;
static int g_iCnt = 100;
int main()
{
HANDLE hThread1 = INVALID_HANDLE_VALUE;
HANDLE hThread2 = INVALID_HANDLE_VALUE;
g_hMutex = CreateMutex(NULL, FALSE, L"Mutex");
// 第二个参数:创建者是否拥有所有权,FALSE为没有所有权,
// 遇到第一个WaitForSingleObject的时候就把所有权给它,
// 所以Thread1里面的WaitForSingleObject(g_hMutex, INFINITE)能够继续执行
if (!g_hMutex)
{
cout << "Failed to CreateMutex !" << endl;
return 0;
}
hThread1 = CreateThread(NULL, 0, Thread1, NULL, 0, NULL);
hThread2 = CreateThread(NULL, 0, Thread2, NULL, 0, NULL);
Sleep(4000); // 让2个线程有足够的时间执行完操作。
CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(g_hMutex);
cin.get();
return 0;
}
DWORD WINAPI Thread1(LPVOID lpParmeter)
{
DWORD dw = -1;
while (true)
{
// 请求事件对象
dw = WaitForSingleObject(g_hMutex, -1); // INFINITE: 长时间等待,差不多50天左右吧!
if (g_iCnt > 0)
{
Sleep(20);
cout<<"return:"<<dw<<endl;
cout << "Thread1:" << g_iCnt-- << endl;
ReleaseMutex(g_hMutex); // 释放资源
}
else
{
ReleaseMutex(g_hMutex);
break;
}
}
return 0;
}
DWORD WINAPI Thread2(LPVOID lpParameter)//thread data
{
DWORD dw = -1;
while (true)
{
// 请求事件对象
dw = WaitForSingleObject(g_hMutex,-1);
if (g_iCnt > 0)
{
Sleep(20);
cout<<"return:"<<dw<<endl;
cout << "thread2:" << g_iCnt-- << endl;
ReleaseMutex(g_hMutex);
}
else
{
ReleaseMutex(g_hMutex);
break;
}
}
return 0;
}
(SAW:Game Over!)