我有一个包含多个工作线程的程序,以及一个接收作业的主线程.在主线程中,我想将作业排队到同步队列,让工作线程在那里等待队列.当队列中有东西时,我希望工作人员从队列中取出作业,而剩下的工作则在那里等待另一份工作.
我找到了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