簡體   English   中英

我是否需要保護一個線程寫入並被多個線程讀取的變量?

[英]Do I need to guard a variable that is written by one thread and read by many?

我正在編寫一個數據采集系統。 該系統既處理來自我們信號數字化儀的快速數據,又處理緩慢的控制/監視,例如用於探測器的高壓系統。 慢速控制系統每秒讀取一次電壓,並將其寫入數據結構。

在寫入磁盤之前,每個事件都用其檢測器的電壓標記。 為此,事件處理線程讀取慢速控制/監視線程編寫的結構。

假設在電壓讀取后X微秒內發生的事件是否標記有前一秒的電壓讀取,都沒有關系: 我是否需要為互斥量而煩惱以保護數據結構或結構中的原子變量?

如果我理解正確,那么第二個線程正在讀取電壓,將其寫入某些“數據結構”,其他線程則不時地從該數據結構讀取(我正確嗎?)

如果此“數據結構”具有原子負載並存儲(例如,x86上的intchar等),則其他線程正在讀取的值可能永遠不會改變(或可能發生其他討厭的事情,例如重新排序) )。 您需要同步以確保原子存儲/加載是從其內存存儲而不是從緩存存儲正確讀取/寫入的。

如果這個“數據結構”不是原子的-那么我們正在處理未定義的行為,這總是錯誤的。

因此,您確實需要通過原子或鎖來使“數據結構”既原子又同步。

如果此“數據結構”足夠小,則std::atomic在這里似乎很合適。 如果不是,請查看您的系統是否支持讀寫器鎖,在這里它們似乎非常適合。

是的,您需要數據是原子的,以消除數據爭用的可能性。 在極端性能要求的情況下,您可以在讀取或寫入變量時使用寬松的內存順序-這將確保原子性,但不會添加順序(如果體系結構不是自然順序的,例如Intel)

暫無
暫無

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

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