winapi – 是否有一组Win32 API函数来管理同步队列?
发布时间:2020-12-13 20:35:32 所属栏目:Windows 来源:网络整理
导读:我有一个包含多个工作线程的程序,以及一个接收作业的主线程.在主线程中,我想将作业排队到同步队列,让工作线程在那里等待队列.当队列中有东西时,我希望工作人员从队列中取出作业,而剩下的工作则在那里等待另一份工作. 我找到了CreateMsgQueue(http://msdn.mic
我有一个包含多个工作线程的程序,以及一个接收作业的主线程.在主线程中,我想将作业排队到同步队列,让工作线程在那里等待队列.当队列中有东西时,我希望工作人员从队列中取出作业,而剩下的工作则在那里等待另一份工作.
我找到了CreateMsgQueue(http://msdn.microsoft.com/en-us/library/ms885180.aspx)但是这似乎仅适用于Windows CE. 我知道我可以自己写这个,但是如果已经存在某些东西我不会使用它是一个傻瓜. 我正在使用Visual Studio 2005在c中进行开发. 感激地收到任何建议. 谢谢
Windows无法准确提供您想要的内容.它提供的功能是
thread pools – 通过这些,您不仅可以自己创建队列,还可以创建或(直接)管理线程.
当然,同步队列也确实存在,而不是作为Windows的一部分.我写的一个看起来像这样: #ifndef QUEUE_H_INCLUDED #define QUEUE_H_INCLUDED #include <windows.h> template<class T,unsigned max = 256> class queue { HANDLE space_avail; // at least one slot empty HANDLE data_avail; // at least one slot full CRITICAL_SECTION mutex; // protect buffer,in_pos,out_pos T buffer[max]; long in_pos,out_pos; public: queue() : in_pos(0),out_pos(0) { space_avail = CreateSemaphore(NULL,max,NULL); data_avail = CreateSemaphore(NULL,NULL); InitializeCriticalSection(&mutex); } void push(T data) { WaitForSingleObject(space_avail,INFINITE); EnterCriticalSection(&mutex); buffer[in_pos] = data; in_pos = (in_pos + 1) % max; LeaveCriticalSection(&mutex); ReleaseSemaphore(data_avail,1,NULL); } T pop() { WaitForSingleObject(data_avail,INFINITE); EnterCriticalSection(&mutex); T retval = buffer[out_pos]; out_pos = (out_pos + 1) % max; LeaveCriticalSection(&mutex); ReleaseSemaphore(space_avail,NULL); return retval; } ~queue() { DeleteCriticalSection(&mutex); CloseHandle(data_avail); CloseHandle(space_avail); } }; #endif (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
推荐文章
站长推荐
- windows – 具有内部存储的双节点故障转移群集
- 如何管理XP,Vista和Win 7客户端的Windows组策略?
- batch-file – 使用xcopy进行并行复制
- 如何从命令提示符或PowerShell获取Windows版本
- microsoft-edge – 如何在Edge Browser中通过Reg
- windows – 是否可以通过WAN链接进行实时或同步复
- 如何在Windows 2016上正确设置docker网络?
- windows-phone-8 – Windows Phone 8:删除数据透
- windows – 在多个服务器上查询EXE详细信息
- Windows -1252不支持编码名称. C#
热点阅读