我在C++和我的主线程中编写多线程程序我正在等待其他线程将程序包放入不同的队列。取决于包的种类以及它们来自哪个线程。C++ std条件变量覆盖很多共享变量
队列受互斥体保护,因为它应该是。
但在我主我不想做:
while(true)
if(!queue1->empty)
{
do stuff
}
if(!queue2->empty)
{
do stuff
}
etc
所以你需要使用条件变量信号的主要事情有了变化。现在我只能阻塞1个条件变量,所以我需要所有这些线程使用相同的条件变量和伴随的互斥。现在我不想真正使用这个互斥锁来锁定我所有的线程。这并不意味着当1个线程写入队列时,另一个线程不能写入完全不同的队列。所以我为每个队列使用单独的互斥体。但是现在我该如何使用条件变量附带的这个额外的互斥锁。
它是如何完成2线程和1队列使用提升,非常类似于标准。 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
};
那么,你如何解决这个问题?
一个队列的问题是程序包是不同类的对象。根据它们在不同线程中产生的类型,还需要在主线程中进行不同的处理。也主要制作包并将它们发送到线程。我正在通过串口与Zigbee通信。我有一个web服务运行,它接受HTTP包,并且我是一个web服务的客户端,它运行某种特殊的数据库,并将数据放入其中。 所以1队列不会工作,导致来自不同类别的数据包或对象。我不想整个演出。 (或者我应该怎么做?) – Silver 2013-03-22 13:41:22
您可以将该类型编码为数字字段,这将消除铸造问题。 – Carl 2013-03-22 21:34:22
Idd我可以做到这一点,但我并不觉得这样做完全舒服。如果不是必要的话,一般的经验法则不会过多。但我想在这种情况下可能有必要。 – Silver 2013-03-24 13:41:04