プロデューサー/コンシューマーに対して正常に動作する次の c++11 コードについての簡単な質問です。問題は、DataQueue をシャットダウンしてすべてのコンシューマーを停止することです。問題は消費者が popWait() を呼び出すだけでブロックされる可能性があるためです。この場合、コンシューマーをシャットダウンするにはどうすればよいですか? これはおそらく修正が必要な設計上の問題です。このコードは理想的にはディスラプター パターンなどを使用してキューのロックを解除する必要があるため、パフォーマンス ヒットが発生しないようにしています。とはいえ、プロデューサーがシャットダウンしたときにポップ待機関数の呼び出しを停止することを消費者に知らせる簡単な方法があるかどうか疑問に思っていました。トリッキーな部分は、キューにまだデータがある場合にシャットダウンすることです。コンシューマーがデータの取得を完了するまで待つ必要があります。私は、消費者が独自のシャットダウンを持っているがアイデアを受け入れる解決策があると信じています. 前もって感謝します。
#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