WaitForSingleObject详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 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函数。

二、功能

  1. 监控hHandle事件的信号状态。
  2. 当 dwMilliseconds > 0 时,该函数处于堵塞状态,直至hHandle标记的对象被触发。
  3. 当 dwMilliseconds = 0 时,不管hHandle标记的对象是否被触发,该函数都会立刻返回。
  4. 当 dwMilliseconds = INFINITE(0xFFFFFFFF) 时,该函数会一直堵塞,直至hHandle标记的对象被触发。
  5. 由于dwMilliseconds 为DWORD型,即:unsigned long,故没有小于0的值。

三、返回值

  1. WAIT_ABANDONED(0x00000080):当hHandle为mutex时,如果拥有mutex的线程在结束时没有释放核心对象会引发此返回值。
  2. WAIT_OBJECT_0( 0x00000000):指定的对象出有有信号状态。
  3. WAIT_TIMEOUT(0x00000102):等待超时。
  4. 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!)

猜你喜欢

转载自blog.csdn.net/itworld123/article/details/81365998