簡體   English   中英

C ++ - 線程和多個隊列

[英]C++ - threads and multiple queues

我需要構建一個工作系統(表示為線程)和(多個)隊列。 單個作業正在其中一個隊列中等待,並等待工作線程處理它們。 每個工作人員只能處理一些隊列中的作業。 沒有旋轉等待。 C / C ++,pthreads,標准POSIX。

對我來說問題是“多個隊列”的事​​情。 我知道如何用一個隊列來實現它。 工作人員需要等待他們可以處理的所有隊列(等待其中的任何隊列)。

在Windows上我會使用WaitForMultipleObjects,但這需要是多平台的。

我不想要任何特定的代碼,只是我應該使用的模型的提示或描述。 提前致謝。

怎么樣:

  • 所有工作線程都在等待信號量
  • 當任何東西被添加到隊列中時,信號量會遞增,從而喚醒單個線程
  • 線程檢查它感興趣的隊列,處理其中一個並返回等待信號量

您將需要額外的互斥鎖來控制對隊列的實際讀取和寫入。

你可以做的是使用一個條件變量 讓您的工作線程等待條件變量。 將作業添加到任何作業隊列時,請通知條件變量。 然后,當工作線程喚醒時,它會檢查它正在等待的隊列。 如果他們中的任何一個人有一份工作,就會把這份工作從隊列中拿走。 否則,它會返回等待條件變量。 等待條件變量會使線程進入休眠狀態,因此不會占用CPU時間。

當然,不言而喻,您應該使用互斥鎖(例如pthread_mutex_t )保護對作業隊列的所有訪問。

如果每個隊列的工作人員不多,則可以為每個工作人員創建一個條件變量。

我最近一直在考慮這個問題,我想出的唯一想法是(假設你有線程安全的隊列)只有多個線程服務於一個隊列。

然后,您可以讓一個或多個工作生成線程,將作業添加到單個隊列中,並在隊列中阻塞一個或多個工作線程,直到找到要處理的內容為止。

如果您有多個工作線程必須輪詢的多個隊列,那么解決方案可能是為每個隊列和一個額外隊列添加一個額外的線程。 額外的線程每個都在自己的單個隊列中阻塞,但只是將作業轉發到額外的隊列。 現在,現有的工作線程又回到了阻塞單個隊列。

聽起來你應該使用boost :: threadboost :: conditionstd :: queue

我要做的是使用boost :: asio來排隊數據,這樣你的多個線程就可以了。 您可以通過post命令將ref傳遞給隊列,並相應地進行線程處理。

為什么不為所有隊列都有一個鎖,而不是為每個隊列分別設置一個鎖?

  1. 等待鎖定
  2. 獲得鎖定
  3. 從任何隊列中出列隊列
  4. 解鎖
  5. 處理出列項目
  6. 轉到第1步

假設出隊時間可以忽略不計(因此鎖只能保持可忽略的時間),可能不需要多於一個鎖。

您可以執行以下操作:每個作業都有一個與之關聯的“隊列”。 例如:

假設你有2個隊列。 你的工作可以說:

job[0].queue = 1; /* That job is in queue 1 */
job[1].queue = 1;
job[2].queue = 2; /* this job is in queue 2 */
... 
etc

那么你有你的“線程包”。 一個線程只是選擇一份工作 - 比如工作[2]。 如果該線程僅允許從隊列1處理作業,則它將該作業放回就緒隊列並選擇不同的作業。

因此,每個線程都知道允許處理哪些隊列,並且在選擇作業時,它確保作業的“隊列”字段匹配。 如果沒有,它會選擇不同的工作。

(這在很多方面都取決於進程調度如何在Linux上運行多個核心。每個進程都有一個位掩碼,說明允許運行哪些處理器,然后處理器確保在執行此操作之前“允許”運行該進程。 )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM