SynchronisedQueue
スレッド間の通信にを使用しています。アタッチしているスレッドが条件変数を待機しているときにスレッドオブジェクトを破棄すると、プログラムがクラッシュすることがわかりました。detach()
これは、スレッドが破棄される前に呼び出すことで修正できます。しかし、条件変数を待機しているスレッドが終了したときに正確に何が起こるのか疑問に思っています。これを回避するために条件変数を使用する別の方法はありますか?
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
template <typename Type> class SynchronisedQueue {
public:
void Enqueue(Type const & data) {
std::unique_lock<std::mutex> lock(mutex_);
queue_.push(data);
condition_.notify_one();
}
Type Dequeue() {
std::unique_lock<std::mutex> lock(mutex_);
while (queue_.empty())
condition_.wait(lock);
Type result = queue_.front();
queue_.pop();
return result;
}
private:
std::queue<Type> queue_;
std::mutex mutex_;
std::condition_variable condition_;
};
class Worker {
public:
Worker(SynchronisedQueue<int> * queue) : queue_(queue) {}
void operator()() {
queue_->Dequeue(); // <-- The thread waits here.
}
private:
SynchronisedQueue<int> * queue_;
};
int main() {
auto queue = new SynchronisedQueue<int>();
Worker worker(queue);
std::thread worker_thread(worker);
worker_thread.~thread(); // <-- Crashes the program.
return 0;
}