[英]Optimally, if a variable is read in many threads but only written in one, should it be read non-atomically in the writing thread?
[英]Do I need to guard a variable that is written by one thread and read by many?
我正在編寫一個數據采集系統。 該系統既處理來自我們信號數字化儀的快速數據,又處理緩慢的控制/監視,例如用於探測器的高壓系統。 慢速控制系統每秒讀取一次電壓,並將其寫入數據結構。
在寫入磁盤之前,每個事件都用其檢測器的電壓標記。 為此,事件處理線程讀取慢速控制/監視線程編寫的結構。
假設在電壓讀取后X微秒內發生的事件是否標記有前一秒的電壓讀取,都沒有關系: 我是否需要為互斥量而煩惱以保護數據結構或結構中的原子變量?
如果我理解正確,那么第二個線程正在讀取電壓,將其寫入某些“數據結構”,其他線程則不時地從該數據結構讀取(我正確嗎?)
如果此“數據結構”具有原子負載並存儲(例如,x86上的int
, char
等),則其他線程正在讀取的值可能永遠不會改變(或可能發生其他討厭的事情,例如重新排序) )。 您需要同步以確保原子存儲/加載是從其內存存儲而不是從緩存存儲正確讀取/寫入的。
如果這個“數據結構”不是原子的-那么我們正在處理未定義的行為,這總是錯誤的。
因此,您確實需要通過原子或鎖來使“數據結構”既原子又同步。
如果此“數據結構”足夠小,則std::atomic
在這里似乎很合適。 如果不是,請查看您的系統是否支持讀寫器鎖,在這里它們似乎非常適合。
是的,您需要數據是原子的,以消除數據爭用的可能性。 在極端性能要求的情況下,您可以在讀取或寫入變量時使用寬松的內存順序-這將確保原子性,但不會添加順序(如果體系結構不是自然順序的,例如Intel)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.