嗨,快速的问题给定以下适用于生产者/消费者的 c++11 代码,问题是我想关闭 DataQueue 并停止所有消费者。尽管存在问题,因为问题是消费者只需调用 popWait() 并且可以被阻止。在这种情况下,我该如何关闭我的消费者?这可能是一个需要纠正的设计问题。我试图不招致任何性能损失,因为此代码理想情况下应该使用中断模式或类似模式来使队列无锁。既然如此,我想知道是否有什么简单的方法可以让消费者知道在生产者关闭时停止调用 pop 等待函数。棘手的部分是如果队列上仍有数据,您将不得不等待消费者完成提取数据时关闭。我相信我有一个解决方案,消费者可以自己关闭但对想法持开放态度。提前致谢。
#ifndef __DataQueue_h__
#define __DataQueue_h__
#include <mutex>
#include <queue>
#include <condition_variable>
#include <chrono>
template <typename DataT>
class DataQueue
{
public:
DataQueue (): _shutdown(false), _waitTime(5), _itemAvailable() {}
void push ( const DataT& data )
{
std::unique_lock<std::mutex> lock(_mutex);
queue.push(data);
_itemAvailable.notify_one();
}
// worked fine until I need to shutdown services... then some were blocked
DataT popWait()
{
std::unique_lock<std::mutex> lock(_mutex);
if(queue.empty())
{
_itemAvailable.wait(lock);
}
DataT temp(queue.front());
queue.pop();
return temp;
}
inline void shutdown()
{
_shutdown = true;
}
private:
std::queue<DataT> queue;
bool _shutdown;
unsigned int _waitTime;
std::mutex _mutex;
std::condition_variable _itemAvailable;
};
#endif