0

我有一個生成器線程可以生成對象並將其放入共享隊列中。將隊列條目廣播到多個線程

我已經產生了一堆消費者線程,可以從這個隊列中讀取。

在理想情況下,我的每一位員工都會從隊列中選擇下一份工作。但是對於某些對象(具有某個屬性),我的每個消費者線程都需要該對象的副本(沒有任何重複項)。

我的第一個衝動是在每次推入隊列之前檢查對象的屬性。如果屬性存在,則創建n個副本(這裏n等於我擁有的工作人員的數量),並將這n個副本推送到隊列中。

該隊列將需要做一些簿記,以防止同一個工人不止一次獲得對象。

執行此簿記的一種方法是創建一個Map,其中鍵爲對象,值爲worker-id(它可以是線程ID)。

對於每個彈出請求,隊列將檢查對象是否已被當前線程ID處理。如果線索ID存在於地圖中,它將退出臨界區而不從隊列中彈出對象,否則將彈出對象並更新地圖。

這種方法的問題在於,很可能單個線程可能使其他線程無法訪問隊列。

有人可以提出一個優雅的方式來解決這個問題?

感謝

回答

2

我的建議:

  • 對每個消費者提供一個隊列,
  • 推新的項目要由所有的消費者來處理所有的隊列,
  • 推動其他項目到最短的隊列,wrt對象的數量(計數信號量上下...)

如果你想要去的幻想,你可以通過一些其他指標,例如確定最短隊列累積的對象尺寸或特定消費者的一些定製服務質量。

+0

這是一個好主意。根據產生的工作人員數量,我可以爲每個工作人員創建一個隊列,然後將該項目推送到每個隊列。唯一的問題是,排隊的數量將隨着消費者的數量成比例地增加。千名工人......千列隊。但我認爲這是一個比替代方案更好的主意,製作了一千份副本並實施了一套複雜的簿記機制,將其分散到消費者當中。 – 2012-08-01 02:58:14