簡體   English   中英

C ++中的線程安全生產者/消費者模式

[英]thread safe producer/consumer pattern in c++

如何開發線程安全的生產者/使用者模式?

在我的情況下,生產者在一個線程中運行,而使用者在另一個線程中運行。

std :: deque為此目的安全嗎?

我可以在一個線程中將push_back返回到雙端隊列的后面,而在另一個線程中將push_front向前推嗎?

編輯1

就我而言,我知道std :: deque中的最大項目數(例如10)。 有什么辦法可以為項目事先保留足夠的空間,以便在處理過程中無需更改隊列內存的大小,從而確保在添加向后推送數據時,前端數據不會發生任何變化?

STL C ++容器不是線程安全的:如果為它們決定,則在推入/彈出元素時需要使用適當的同步(基本上是std::mutexstd::lock )。

或者,您可以使用設計正確的容器(單個生產者-單個消費者隊列應滿足您的需求),此處是其中一個示例: http//www.boost.org/doc/libs/1_58_0/doc/html/lockfree。 html

編輯后的插件:

是的,SPSC隊列基本上是環形緩沖區,完全可以滿足您的需求。

如何開發線程安全的生產者/使用者模式?

有幾種方法,但是使用鎖和監視器非常容易掌握,並且沒有很多隱藏的警告。 標准庫具有std::unique_lockstd::lock_guardstd::condition_variable來實現該模式。 請查看condition_variable的cppreference頁面以獲取簡單示例。

std :: deque為此目的安全嗎?

不安全 您需要同步。

我可以在一個線程中將push_back返回到雙端隊列的后面,而在另一個線程中將push_front向前推嗎?

可以,但是您需要同步。 當隊列為空或只有一個元素時,存在競爭條件。 同樣,當隊列已滿或不足一小時時,如果您想限制其大小,則可以。

我認為您的意思是push_back()pop_front()

std::deque本身不是線程安全的。 您將需要使用std::mutex序列化訪問權限,以便在生產者嘗試推送時,消費者不會嘗試彈出。

您還應該考慮如何處理以下內容:

  1. 如果雙端隊列查找下一個項目時,雙端隊列為空,那么消費者的行為如何?

如果進入等待狀態,則當將雙端隊列添加到時,您將需要由生產者通知std::condition_variable 您可能還需要處理程序終止,其中消費者正在等待雙端隊列,並且程序終止了。 除非您正確地安排事情,否則它可能會“永遠等待”。

10個項目是“可貴的”,所以我不會理會保留空間。 std::deque會自動增長和收縮,因此在構建可運行的應用程序之前,請不要進行細粒度調整。

過早的優化是萬惡之源。

注意:目前尚不清楚如何限制隊列大小,但是如果生產者填滿隊列,然后等待其清除下來,您將需要更多的等待和條件,以其他方式進行協調。

暫無
暫無

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

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