我正在編寫一個程序,其中幾個生產者生成一些數據,應該由幾個消費者處理。由於每段數據消耗大約需要100ms,而目標平臺有很多處理器,因此我認爲每個生產者和每個消費者都有自己的線程。我的問題是:Qt信號/插槽是將數據塊從生產者傳遞給消費者的好方法嗎?或者你建議一個更好的解決方案(強烈首選Qt)。Qt信號/插槽生產者/消費者
以防萬一它是相關的,生產者每小時產生幾十萬的突發數據。
我正在編寫一個程序,其中幾個生產者生成一些數據,應該由幾個消費者處理。由於每段數據消耗大約需要100ms,而目標平臺有很多處理器,因此我認爲每個生產者和每個消費者都有自己的線程。我的問題是:Qt信號/插槽是將數據塊從生產者傳遞給消費者的好方法嗎?或者你建議一個更好的解決方案(強烈首選Qt)。Qt信號/插槽生產者/消費者
以防萬一它是相關的,生產者每小時產生幾十萬的突發數據。
我不認爲信號/槽機構是合適的在這裏,因爲每個信號被分配給所有連接時隙。這意味着如果您使用信號/插槽機制作爲您的「工作隊列」,那麼您不會獲得負載分配給消費者,而是所有消費者都會執行相同的(重複)工作。
一個更好的機制是使用一個容器作爲工作隊列(生產者向容器中添加項目,消費者移除它們),使用QMutex
來避免併發問題,一個(或者兩個,如果你想強加一個最大大小)QWaitCondition
阻止消費者,當他們沒有工作。
考慮到我的情況,我發現這似乎是最好的選擇。我似乎沒有在Qt中找到線程安全的隊列類,就像一個Python標準庫一樣,所以我留下了互斥體和等待條件。這不是非常困難,但我們是一個懶惰的巢,我們的程序員!如果你知道更好的選擇,請讓我知道。感謝您的幫助。 – Elektito
我不認爲有可能編寫一個真正通用的線程安全隊列,因爲每個項目對該隊列有不同的要求。只需編寫自己完全符合您的需求的w.r.t.同步並在引擎蓋下使用非線程安全的容器。 –
我建議你避免使用信號和插槽,因爲它們作爲事件發揮作用,所以一旦信號發出就沒有執行的控制。所以,我建議你使用鎖或互斥鎖(例如QMutex)進行互斥。只需使用QMutex類的鎖定和解鎖方法來保護您的隊列。我認爲它會比使用信號和插槽更快,因爲如果你傳遞對象,它將傳遞對象的副本,並且在你傳遞指針的情況下,你將不會保護對象。
乾杯,
這很好。不過,看看這個視頻,特別是從27分鐘開始(跨線程信號插槽):[Qt Developer Days 2011 - Multithreading](http://qt-project.org/videos/watch/advanced-qt-a -deep-dive-3-6-multithreading-1) – leemes