簡體   English   中英

共享變量的競爭條件

[英]Race condition for shared variable

我有一個double類型的共享變量。 這個變量將由兩個線程訪問。 一個線程將只編寫變量,而另一個線程將只讀取變量。

我還能在這里得到比賽條件嗎? 如果是的話,C ++中是否有一種“簡單”的方式來實現原子訪問? 如果有更多的讀取而不是寫入,我如何有效地實現它? 我需要將變量標記為volatile嗎?

編輯:好的“閱讀器”線程定期對批量數據工作,新值的傳播不是時間敏感的。 我沒有實現我沒有好的測試方法的復雜聯鎖,而是可以聲明寫入線程將寫入的另一個臨時變量。 然后,當讀者完成一個批處理時,它可以將臨時值原子傳播到實際變量。 這會沒有競爭條件嗎?

是的,存在競爭條件,因為在大多數處理器上double變量不是原子的。

使用3個雙打(可能是一個陣列之間有額外的填充,以避免錯誤共享,從而導致性能下降)。

一個由讀者擁有,一個由作者擁有,一個正在交付。

寫入:寫入寫入時隙,然后原子地交換(例如,使用InterlockedExchange )寫入時隙的指針/索引和切換時隙的索引。 由於索引是指針大小或更小,只要變量正確對齊,原子交換就很容易。 如果您的平台偶然提供帶或不帶內存屏障的互鎖交換,請使用帶有內存屏障的平台。

要讀取:原子地將讀取槽的指針/索引與切換變量的索引交換。 然后讀取讀取插槽。

您實際上也應該包含版本號,因為讀取的線程將傾向於在最新和上一個插槽之間反彈。 閱讀時,請在交換之前和之后閱讀,然后使用更高版本的版本。

或者,在C ++ 11中,只需使用std::atomic

警告:以上內容僅適用於單個編寫器/單個閱讀器(此問題中的特定情況)。 如果您有多個,請考慮讀取器 - 寫入器鎖或類似的保護對變量的所有訪問。

您可能想看一下討論基本類型的讀/寫:

C ++是否讀取和寫入了原子?

暫無
暫無

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

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