使用Windows API进行MessageQueue同步

时间:2015-11-04 07:53:19

标签: c++ windows multithreading mfc

我需要一个MessageQueue来存储对象,2个线程将作为生产者和cousumer。我打算用std::queue来存储对象。我在VC 6.0上使用MFC和C ++。对于2个线程之间的同步,可以使用同步原语,因为我不能在VC 6.0上使用C ++ 11。

请给我一些指示?我打算使用CriticalSectionEvent。有没有更好的方法来处理这个? std::queue是否是线程安全的?

1 个答案:

答案 0 :(得分:0)

我不熟悉MFC同步工具,但你想做的事情肯定是可能的。

编辑:根据评论中人们的意见,在这种情况下CCriticalSection似乎比CMutex更好,所以我更新了答案。

对于线程之间的信令,使用信号量将是一个不错的选择。维基百科有nice example of pseudocode使用信号量来处理生产者 - 消费者/有界缓冲问题。请注意,您将需要两个信号量,一个用于计算队列中有多少项以及队列剩余的多少个插槽。请注意,除了信号量之外,具有两个以上的线程,还需要互斥型或临界区同步机制(请参阅wiki链接,第二个代码示例)。这可能看似违反直觉,但请记住,生产者和消费者在行动之前正在等待两个不同的队列条件。

基于我所读到的,一个很好的选择是使用CCriticalSection成员创建自己的包装器类,然后当你想要锁定资源时(就像你在一个包装器类中那样'get get / set member function)您调用CCriticalSection的{​​{1}}方法(shown here)。完成共享资源后,请务必在Lock()上致电Unlock()

Adapted From MSDN

CCriticalSection

正如评论和in the MSDN docs中所指出的,#include <queue> class SharedQueue { static std::queue<int> _qShared; //shared resource static CCriticalSection _critSect; public: SharedQueue(void) {} ~SharedQueue(void) {} void push(int); //locks, modifies, and unlocks shared resource }; //Declaration of static members and push_back std::queue<int> SharedQueue::_qShared; CCriticalSection SharedQueue::_critSect; void SharedQueue::push(int item) { _critSect.Lock(); _qShared.push(item); _critSect.Unlock(); } 在访问您的共享资源时不会跨越流程边界时非常有用。在这种情况下,它比CCriticalSection更具性能。

您需要打包CMutex,因为不是线程安全的。假设STL中的任何容器都不是线程安全的,除非文档特别提到它。