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

本文聚焦Windows下多线程编程,通过实例代码探讨命名事件对象在线程同步中的应用,作为对互斥对象的补充,为深入理解线程同步提供实践参考。
摘要由CSDN通过智能技术生成

本篇介绍命名的事件对象, 命名的事件对象的功能和原理其实和命名的互斥对象的功能和原理差不错, 所以在此篇中就不在进行详细的说明了, 如有疑问请看我的《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多线程程序设计之线程同步分析(结合互斥对象)(下) 》中的运行结果是一样的, 这里就不给出了, 结合这分析。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值