簡體   English   中英

內存排序,其他執行和多線程安全

[英]Memory Ordering, Out of other Execution and Multi thread Safety

最近,我一直在閱讀有關內存重新排序的信息。 我的問題是關於多線程方案。 考慮下面的示例:

A = 0;
B = 0;

Thread 1 on Processor 1                       Thread 2 on Processor 2

    A = 100;                                      while(B== 0);
    B = 1;                                       //access A here

我一直在X86-64 Windows平台上進行編碼,但從未考慮過可以重新排序存儲到A和B的存儲(在編譯器級別或在硬件級別),並且最終我可能在線程2中以B = 0結束並且發現A仍然是0.使用此類代碼絕不會遇到任何問題或令人討厭的錯誤。 是因為x86-x64的排序嚴格,Windows C編譯器也是如此。

為了使這樣的代碼在內存弱序的任何其他平台上執行,我是否需要確保更新並訪問鎖中的A和B(假設基礎鎖實現使用了內存屏障,並確保僅在鎖定之后才釋放該鎖)所有先前的加載和存儲在所有處理器內核中都是可見的)。

謝謝

是因為x86-x64的排序嚴格,Windows C編譯器也是如此。

實際上, X86是一個有序的CPU,不允許對存儲進行重新排序。 因此,所有CPU內核都將遵守編譯器發出的順序。

但是, B在處理器1上被修改,而在處理器2上被讀取。這是C內存模型在沒有同步的情況下不允許的(嘗試最大程度地優化編譯器,它可能會停止工作)。

盡管可以使用鎖定來在內核之間進行同步,但是由於您在B上旋轉,因此可能存在問題。 如果在獲取鎖的情況下發生這種情況,則處理器1無法更新該值。

正確的解決方案是使B atomic 這樣可以保證在所有級別上的正確訂購。

暫無
暫無

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

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