我需要一个MessageQueue来存储对象,2个线程将作为生产者和cousumer。我打算用std::queue
来存储对象。我在VC 6.0上使用MFC和C ++。对于2个线程之间的同步,可以使用同步原语,因为我不能在VC 6.0上使用C ++ 11。
请给我一些指示?我打算使用CriticalSection
和Event
。有没有更好的方法来处理这个?
std::queue
是否是线程安全的?
答案 0 :(得分:0)
我不熟悉MFC同步工具,但你想做的事情肯定是可能的。
编辑:根据评论中人们的意见,在这种情况下CCriticalSection
似乎比CMutex
更好,所以我更新了答案。
对于线程之间的信令,使用信号量将是一个不错的选择。维基百科有nice example of pseudocode使用信号量来处理生产者 - 消费者/有界缓冲问题。请注意,您将需要两个信号量,一个用于计算队列中有多少项以及队列剩余的多少个插槽。请注意,除了信号量之外,具有两个以上的线程,还需要互斥型或临界区同步机制(请参阅wiki链接,第二个代码示例)。这可能看似违反直觉,但请记住,生产者和消费者在行动之前正在等待两个不同的队列条件。
基于我所读到的,一个很好的选择是使用CCriticalSection
成员创建自己的包装器类,然后当你想要锁定资源时(就像你在一个包装器类中那样'get get / set member function)您调用CCriticalSection
的{{1}}方法(shown here)。完成共享资源后,请务必在Lock()
上致电Unlock()
。
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中的任何容器都不是线程安全的,除非文档特别提到它。