[英]C++ thread safety - exchange data between worker and controller
我對該主題仍然感到不安全,希望大家能幫助我-
為了在輪詢某些內容的工作線程與對最新數據感興趣的控制線程之間傳遞數據(配置或結果),我最終或多或少地重復使用了以下模式:
Mutex m;
tData * stage; // temporary, accessed concurrently
// send data, gives up ownership, receives old stage if any
tData * Send(tData * newData)
{
ScopedLock lock(m);
swap(newData, stage);
return newData;
}
// receiving thread fetches latest data here
tData * Fetch(tData * prev)
{
ScopedLock lock(m);
if (stage != 0)
{
// ... release prev
prev = stage;
stage = 0;
}
return prev; // now current
}
注意:這不應該是完整的生產者-消費者隊列,只有msot最近數據是相關的。 另外,我在這里略略了資源管理。
必要時,我使用兩個這樣的階段:一個將配置更改發送給工作程序,以及將結果發送回。
現在,我的問題
假設ScopedLock實現了完整的內存屏障:
boost::shared_ptr
? ScopedLock充當完整的內存屏障。 由於所有這些都或多或少地依賴於平台,因此可以說Visual C ++ x86或x64,盡管也歡迎其他平台的差異/說明。
(對“ Intel TBB”之類的庫的推薦,表示“感謝”,我想在這里理解平台問題)
好吧,這是一個問題:
您的send函數需要通過引用(或指向指針的指針)傳遞newData。 否則,交換的結果將永遠不會返回給調用者。
您不需要volatile就意味着每次訪問數據時總是從內存中讀取數據。 由於您的程序總是在更改stage的值,因此編譯器將知道發生了什么,一切都會很好。 僅當程序外有其他值更改時,才使用volatile。 例如,您有一個串行端口正在將數據發送到內存中的某個位置,並且您的程序正在輪詢該內存以進行更新。 每次輪詢該內存時,都必須檢查內存,而不是緩存,這就是使用volatile的地方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.