2

我有一个带有多个工作线程的程序和一个接收作业的主线程。在主线程中,我想将作业排入同步队列,并让工作线程坐在那里等待队列。当队列中有东西时,我希望工作人员从队列中拉出工作,而剩余的工作则坐在那里等待另一个工作。

我找到了 CreateMsgQueue(http://msdn.microsoft.com/en-us/library/ms885180.aspx),但这似乎只存在于 Windows CE 中。

我知道我可以自己写这个,但是如果某些东西已经存在,我会傻到不使用它。

我正在使用 Visual Studio 2005 在 c++ 中进行开发。

任何建议都非常感激。

谢谢丰富

4

1 回答 1

4

Windows 不能提供你想要的东西。它提供的是线程池——有了这些,您不仅不必自己创建队列,而且您也不必创建或(直接)管理线程。

当然,同步队列也确实存在,只是不是 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, max, NULL);
        data_avail = CreateSemaphore(NULL, 0, max, 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, 1, NULL);
        return retval;
    }

    ~queue() { 
        DeleteCriticalSection(&mutex);
        CloseHandle(data_avail);
        CloseHandle(space_avail);
    }
};

#endif
于 2010-06-16T15:34:59.303 回答