我正在用 C++ 编写一个多线程程序,在我的主线程中,我正在等待其他线程将包放入不同的队列中。取决于包的种类和它们来自哪个线程。
队列应该受到互斥锁的保护。
但在我的主要我不想做:
while(true)
if(!queue1->empty)
{
do stuff
}
if(!queue2->empty)
{
do stuff
}
etc
因此,您需要使用条件变量来向 main 发出信号表明某些事情发生了变化。现在我只能阻塞 1 个条件变量,所以我需要所有这些线程使用相同的条件变量和附带的互斥锁。现在我不想真正使用这个互斥锁来锁定我所有的线程。这并不意味着当一个线程写入队列时,另一个线程不能写入完全不同的队列。所以我为每个队列使用单独的互斥锁。但是现在我如何使用条件变量附带的这个额外的互斥锁。
它是如何使用 boost 完成 2 个线程和 1 个队列的,与 std 非常相似。 http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html:
template<typename Data>
class concurrent_queue
{
private:
boost::condition_variable the_condition_variable;
public:
void wait_for_data()
{
boost::mutex::scoped_lock lock(the_mutex);
while(the_queue.empty())
{
the_condition_variable.wait(lock);
}
}
void push(Data const& data)
{
boost::mutex::scoped_lock lock(the_mutex);
bool const was_empty=the_queue.empty();
the_queue.push(data);
if(was_empty)
{
the_condition_variable.notify_one();
}
}
// rest as before
};
那么你如何解决这个问题呢?