我正在開發一個小型多線程項目。系統可以分爲2個子部分,A和B.數據從A流向B.
部分保持原生來自外部世界的數據,做一些轉換,然後生成數以千計的新數據,我們稱之爲A_OUTPUT。
B部分根據每個A_OUTPUT做一些計算然後生成更多的數據,可能是A_OUTPUT數量的十倍。生產者 - 消費者問題中的設計問題
我很困惑如何同步2個部分。
我自己的設計是創建一個工作隊列以及一個保護兩個子部件之間隊列的鎖。還要創建一個事件來指示工作隊列是否爲空。
一個部分由多個線程組成,每個線程從外部獲取數據並生成A_OUTPUT,每次單個A線程生成一個A_OUTPUT時,線程獲取隊列鎖,將A_OUTPUT推入隊列,釋放鎖,然後觸發事件。
B部分包含主管線程和多個工作線程,主管線程首先被阻塞在事件上。事件觸發後,主管線程鎖定隊列,獲取隊列的所有A_OUTPUTS,釋放鎖,將A_OUTPUTS分派給工作線程,然後再次等待事件。
這種設計的問題是顯而易見的,B的主管線將與多線程贏得了隊列鎖賽車。也許當B終於擁有這個鎖時,隊列中已經有10個或更多的A_OUTPUT了,最老的A_OUTPUT很久以前就已經生成了。我希望儘可能快地處理每個A_OUTPUT。
我知道我可以劃分工作隊列分成幾個較小的隊列或添加較多的B主管線程注入鎖定戰鬥,縮短平均時間每A_OUTPUT等待它得到處理之前。但是可能存在更合適的設計?
而另一個問題,確實存在着對不同目的的多線程程序的任何模式或設計模式?
這裏涉及2個概念:隊列鎖定和同步。我不熟練使用C++,但java在處理這個隊列對象中處理這兩個概念,名爲'Blocking Queue':http://download.oracle.com/javase/1.5.0/docs/api/java/ util/concurrent/BlockingQueue.html – DanC
你打算如何控制創建的B工作線程的數量,不可能只是失去控制。 「獲取隊列的所有A_OUTPUTS」聽起來不是一個好主意,因爲如果處理A_OUTPUTS需要時間,因爲我們正在研究無限制的線程創建。我認爲我們在這裏需要某種線程池。 –