Windows多线程程序设计之线程同步分析(结合事件对象)(下)

本篇介绍命名的事件对象, 命名的事件对象的功能和原理其实和命名的互斥对象的功能和原理差不错, 所以在此篇中就不在进行详细的说明了, 如有疑问请看我的《Windows多线程程序设计之线程同步分析(结合互斥对象)(下)》连接地址:点击打开链接, 在这里我只给出相应的代码,如下:

#include <windows.h>
#include <iostream>

using namespace std ;

DWORD WINAPI ThreadProc1(LPVOID lpParameter) ;
DWORD WINAPI ThreadProc2(LPVOID lpParameter) ;

int tickets = 100 ;
HANDLE g_hEvent ;

int main()
{
	HANDLE hThread1 ;
	HANDLE hThread2 ;
	
	hThread1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL) ;
	hThread2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL) ;

	CloseHandle(hThread1) ;
	CloseHandle(hThread2) ;

	g_hEvent = CreateEvent(NULL, FALSE, FALSE, "ticket") ;	// 创建一个命名的自动重置的事件对象, 并且将初始化状态设置为非信号态

	if (g_hEvent)
	{
		if (ERROR_ALREADY_EXISTS == GetLastError())
		{
			cout << "only instance can run!" << endl ;
			return 0 ;
		}
	}

	SetEvent(g_hEvent) ;				// 设置事件对象的状态为信号态

	Sleep(4000) ;

	CloseHandle(g_hEvent) ;

	return 0 ;
}

DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
	while (TRUE)
	{
		WaitForSingleObject(g_hEvent, INFINITE) ;

		if (tickets > 0)
		{
			Sleep(1) ;
			cout << "thread one sell ticket: " << tickets-- << endl ;
		}	
		else 
		{
			break ;
		}
		
		SetEvent(g_hEvent) ;			// 设置事件对象的状态为信号态
	}

	return 0 ;
}

DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{
	 while (TRUE)
	 {
		WaitForSingleObject(g_hEvent, INFINITE) ;

		if (tickets > 0)
		{
			Sleep(1) ;
			cout << "thread two sell ticket: " << tickets-- << endl ;
		}	
		else 
		{
			break ;
		}

		SetEvent(g_hEvent) ;			// 设置事件对象的状态为信号态
	 }

	 return 0 ;
}
最后的运行结果和 Windows多线程程序设计之线程同步分析(结合互斥对象)(下) 》中的运行结果是一样的, 这里就不给出了, 结合这分析。


你可能感兴趣的:(多线程,编程,C++,windows,对象)