使用C++ 11標準庫(最終只有boost::thread
的幫助)有一個乾淨的方式來實現N個讀取器--1個生產者解決方案,所有讀者,一旦通過生產者同時通知(例如std::condition_variable::notify_all()
),則保證在生產者最終將第二次進入其關鍵部分之前進入他們的關鍵部分。換句話說,所有通知的讀者必須遵守共享資源的相同狀態。一旦生產者注意到N個閱讀器,它就不能修改共享資源,直到所有N個閱讀器完成閱讀。請注意,boost :: barrier並不是我所需要的,因爲我事先不知道N. N可能因通知而異。N個併發讀者和1個生產者的成語或模式
0
A
回答
1
您可以使用atomic counters,以及來自生產者線程的一些輪詢。
當計數器達到N
或0
(這取決於你)時,生產者可以開始工作並生產任何需要生產的東西。在通知條件變量之前,生產者將計數器設置爲0
(或N
)。
閱讀器完成後,它只是增加(或減少)計數器。
1
相關問題
- 1. 同步1個生產者和多個消費者(多線程)
- 2. 單源生產者並行工作的多個併發者
- 3. 等待完成n個作品完成:生產者,消費者和計數器
- 4. 併發與多個生產者/多個消費者
- 5. 生產者/消費者模型和併發內核
- 6. 生產者/消費者模式與批生產者
- 7. Odoo 10開發者模式和開發者模式與資產
- 8. 生產者 - 消費者多個生產者多個隊列單個消費者
- 9. 實現生產者消費者模式
- 10. C#生產者/消費者模式
- 11. 生產者/消費者模式和觀察者模式之間的區別
- 12. 多個併發讀者
- 13. Java生產者消費者1 - N線程
- 14. 多個生產者,單個消費者
- 15. 生產者消費者模式你如何通知完成?
- 16. Java多線程兩個生產者和1個消費者問題
- 17. 一個生產者,兩位消費者作用於由生產者生產
- 18. 併發生產者和消費者在去
- 19. java併發性,生產者(代理)和消費者
- 20. 多個生產者和多個消費者的Redis pub子
- 21. 使用的RabbitMQ - 多個生產者和多個消費者
- 22. Go的生產者/消費者的最新成語是什麼?
- 23. ActiveMQ一個生產者多消費者
- 24. 生產者/消費者模式使用線程和EventWaitHandle
- 25. 線程池和生產者 - 消費者模式設計問題
- 26. 使用java和spring生產者 - 消費者模式
- 27. 正確的ActiveMQ生產者併發性
- 28. 同步生產者,消費者和生產者隊列
- 29. ZeroMQ + ReactPHP:多個生產者(推)和多個消費者(拉)
- 30. 一個生產者,兩個消費者和使用pthread_cond_signal&pthread_mutex_lock
它沒有一個櫃檯工作:如果*新*讀者前來生產者通知等待讀者後會發生什麼?如果新讀者(原子)增加「老年」讀者減少的相同計數器,那麼製片人可能永遠不會醒來。 – Martin
@Martin倒數到零。如果一個新的閱讀器出現(或消失),那麼只需增加(或減少)'N',然後在生產者中檢查小於或等於零。 –
我仍然沒有看到如何增加/減少計數器,這種方式解決了我的問題。假設有兩位讀者正在等待。製片人通知他們所有人,所以N變成2.第一個讀者減少計數器,N = 1。好。現在,如果第三個讀者到達,它不應該增加計數器,因爲它不屬於兩個讀者的組。它應該等待來自制作人的第二個通知,該通知只能在第二個閱讀器完成其工作之後纔開始。 – Martin