[英]thread safe producer/consumer pattern in c++
如何開發線程安全的生產者/使用者模式?
在我的情況下,生產者在一個線程中運行,而使用者在另一個線程中運行。
std :: deque為此目的安全嗎?
我可以在一個線程中將push_back返回到雙端隊列的后面,而在另一個線程中將push_front向前推嗎?
就我而言,我知道std :: deque中的最大項目數(例如10)。 有什么辦法可以為項目事先保留足夠的空間,以便在處理過程中無需更改隊列內存的大小,從而確保在添加向后推送數據時,前端數據不會發生任何變化?
STL C ++容器不是線程安全的:如果為它們決定,則在推入/彈出元素時需要使用適當的同步(基本上是std::mutex
和std::lock
)。
或者,您可以使用設計正確的容器(單個生產者-單個消費者隊列應滿足您的需求),此處是其中一個示例: http : //www.boost.org/doc/libs/1_58_0/doc/html/lockfree。 html
編輯后的插件:
是的,SPSC隊列基本上是環形緩沖區,完全可以滿足您的需求。
如何開發線程安全的生產者/使用者模式?
有幾種方法,但是使用鎖和監視器非常容易掌握,並且沒有很多隱藏的警告。 標准庫具有std::unique_lock
, std::lock_guard
和std::condition_variable
來實現該模式。 請查看condition_variable的cppreference頁面以獲取簡單示例。
std :: deque為此目的安全嗎?
不安全 您需要同步。
我可以在一個線程中將push_back返回到雙端隊列的后面,而在另一個線程中將push_front向前推嗎?
可以,但是您需要同步。 當隊列為空或只有一個元素時,存在競爭條件。 同樣,當隊列已滿或不足一小時時,如果您想限制其大小,則可以。
我認為您的意思是push_back()
和pop_front()
。
std::deque
本身不是線程安全的。 您將需要使用std::mutex
序列化訪問權限,以便在生產者嘗試推送時,消費者不會嘗試彈出。
您還應該考慮如何處理以下內容:
如果進入等待狀態,則當將雙端隊列添加到時,您將需要由生產者通知std::condition_variable
。 您可能還需要處理程序終止,其中消費者正在等待雙端隊列,並且程序終止了。 除非您正確地安排事情,否則它可能會“永遠等待”。
10個項目是“可貴的”,所以我不會理會保留空間。 std::deque
會自動增長和收縮,因此在構建可運行的應用程序之前,請不要進行細粒度調整。
過早的優化是萬惡之源。
注意:目前尚不清楚如何限制隊列大小,但是如果生產者填滿隊列,然后等待其清除下來,您將需要更多的等待和條件,以其他方式進行協調。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.