我有一個發佈者線程和一個消費者線程。他們通過std::stack<Data *>
共享數據。發佈者只需push()指針和消費者只需彈出()指針,使用它並調用delete就可以了。由於一次只有一個線程發佈指針,而一個線程使用指針,是否需要同步堆棧?請記住,堆棧僅存儲指針。僅當Data()完全構造時,Publisher纔會推入指針。通過發佈者和消費者線程之間的堆棧共享數據
0
A
回答
3
未能在非const
上同步容器的方法std
命名空間中的未定義行爲。
對於stack
的底層容器,push
和pop
都不是const
。所以兩個線程都寫入stack
的底層容器的狀態。
想想看,這兩種方法至少都必須爭取stack
中元素數的計數:一個試圖增加它,另一個試圖減少它。 (還有其他問題,但是應該讓你相信兩者都寫入了stack
的狀態)
1
的std::stack<Data*>
實例將需要訪問多於一個線程同步,可以(經由pop()
和push()
)被修改,但不作爲只有一個線程可以被一個元件上的任何一個操作包含的元素時間。
1
是的,有必要同步訪問堆棧,因爲std::stack
類不保證任何操作是原子的,這是可能的,即push()
,top()
和pop()
將交錯。
相關問題
- 1. 生產者/消費者共享內存和進程
- 2. Java線程生產者和消費者
- 3. 消費者生產者多線程消費者不會消逝
- 4. 生產者/消費者線程中的油門消費者
- 5. 在kafkacat消費者之間共享信息
- 6. 生產者 - 消費者線程間通信
- 7. 生產者和消費者之間的RabbitMQ消息延遲
- 8. ActiveMQ - 消費者不共享負載
- 9. 在生產者/消費者多線程環境中優化共享緩衝區
- 10. java線程:生產者 - 消費者
- 11. 多線程生產者/消費者
- 12. 多線程生產者/消費者
- 13. 如何線程(生產者/消費者)
- 14. 消費者生產者線程問題
- 15. boost ::線程生產者消費者
- 16. Java生產者消費者線程
- 17. 生產者和消費者的互斥和線程編程
- 18. Java:信號量:生產者消費者:線程和線程組
- 19. 生產者 - 消費者堆棧行爲,而不是隊列
- 20. Java生產者 - 消費者:生產者不「通知()」消費者
- 21. 主線消費者和其他線程的生產者
- 22. 根本沒有輸出數據生產者/消費者線程
- 23. 卡夫卡消費者沒有獲取生產者共享的最新數據
- 24. 生產者/消費者設計 - 共享隊列中的Qt
- 25. 塊和喚醒消費者線程/
- 26. 消費者過濾的生產者 - 消費者阻塞隊列
- 27. WPF工作者線程需要通過消費者通知暫停
- 28. 消費者和提供者
- 29. WCF MSMQ消費者線程數
- 30. Java線程生產者和消費者程序問題
是的,你必須同步。 'push()'和'pop()'不是原子操作。 – juanchopanza