簡體   English   中英

在c ++中使用帶內存屏障的雙重檢查鎖定時正確的方法是什么?

[英]What the correct way when use Double-Checked Locking with memory barrier in c++?

我剛剛讀了優秀的博客C ++和Double-Checked Locking的危險

而且我不明白為什么我們必須使用示例12中的第一個內存屏障(如下所示):

Singleton* Singleton::instance () {
       Singleton* tmp = pInstance;
       ... // insert memory barrier
       if (tmp == 0) {
          Lock lock;
          tmp = pInstance;
          if (tmp == 0) {
             tmp = new Singleton;
             ... // insert memory barrier
             pInstance = tmp;
          }
       }
       return tmp;
    }

將其更改為以下代碼是否安全? 為什么不?

Singleton* Singleton::instance () {
       if (pInstance == 0) {
          Lock lock;
          if (pInstance == 0) {
             Singleton* tmp = new Singleton;
             ... // insert memory barrier
             pInstance = tmp;
          }
       }
       return pInstance;
    }

不,這不安全。 閱讀示例之前的三段以及之后的兩段,潛在的問題是系統在刷新Singleton結構之前在線程B上完成了對pInstance的寫入(刷新到內存)。 然后線程A可以讀取pInstance ,將指針視為非空,然后返回該指針,從而可能允許線程A在線程B將其存儲到內存中之前訪問Singleton

嘗試在其他線程中使用它之前 ,必須進行第一次刷新,以確保在構造Singleton期間完成對寫操作的刷新。

取決於您所運行的硬件,這可能不是問題。

暫無
暫無

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

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