我在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