C++系列---信号量同步详解

C++系列---信号量同步详解

2023年6月22日发(作者:)

C++系列---信号量同步详解⼀、线程同步1、线程同步多线程程序设计⼤多会涉及线程间相互通信。主线程在创建⼯作线程以后,⼯作线程之间还需要通过通信机制来协同⼯作。⼀种⽐较好的⽅法就是使⽤事件内核对象。事件内核对象是⼀种⽤于多线程同步和他们之间的通信⼿段。同步可以保证在⼀个时间内只有⼀个线程对某个共享资源有控制权。

2、汽车东西⾛向与南北⾛向协调的问题

⼆、事件内核对象1、事件内核对象事件内核对象是⼀种抽象的对象,它也有未受信和受信两种状态,可以使⽤WaitForSingleObject函数等待其变成受信状态。不同于其他内核对象的⼀些函数可以使实践对象在这两种状态之间转换。可以把时间对象看成是⼀个设置在Windows内部的⼀个标志。它的状态设置和测试⼯作由Windows来完成。时间对象包含3个成员:nUsageCount:使⽤计数bManualReset:是否⼈⼯重置bSignaled:是否受信

2、基本函数 //使⽤CreateEvent函数创建事件对象:HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes, // ⽤来定义事件对象的安全属性BOOL bManualReset, // 指定是否需要⼿⼯重置事件对象为受信状态BOOL bInitialState, // 指定事件对象创建时的初始状态LPCWSTR lpName); // 事件对象的名称

//根据lpName对象的名字查询,返回事件对象句柄:HANDLE OpenEvent(DWORD dwDesiredAccess, // 指定想要的访问权限BOOL bInheritHandle, // 指定返回句柄是否被继承LPCWSTR lpName); // 要打开的事件对象的名称BOOL SetEvent(HANDLE hEvent); // 将事件状态设置为受信状态BOOL ReSetEvent(HANDLE hEvent); // 将事件状态设置为未受信状态三、实例1、多线程同步,实现两个线程交互打印A、B#include #include #include HANDLE g_hEventEW,g_hEventNS; // 东西与南北事件UINT _stdcall ProcessA(LPVOID lpParam){ while (true) { WaitForSingleObject(g_hEventEW, INFINITE); printf("An"); SetEvent(g_hEventNS); Sleep(200); } return 0;}UINT _stdcall ProcessB(LPVOID lpParam){ while (true) { WaitForSingleObject(g_hEventNS, INFINITE); printf("Bn"); SetEvent(g_hEventEW); Sleep(200); } return 0;}int main(){ HANDLE H[2]; H[0] = (HANDLE)_beginthreadex(NULL, 0, ProcessA, NULL, 0, NULL); H[1] = (HANDLE)_beginthreadex(NULL, 0, ProcessB, NULL, 0, NULL);

// 问题1:主线程如何调⽤A,B两个线程 // 东西向的先⾛ g_hEventEW = CreateEvent(NULL, FALSE, TRUE, NULL); g_hEventNS = CreateEvent(NULL, FALSE, FALSE, NULL); WaitForMultipleObjects(2, H, TRUE, INFINITE); // ⽆限等待 // 问题2:A、B如何交互打印 system("pause"); return 0;}2、实验结果

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1687426601a9203.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信