首頁 >後端開發 >C++ >如何在沒有互斥體的情況下在 C 11 實現無鎖單例?

如何在沒有互斥體的情況下在 C 11 實現無鎖單例?

Patricia Arquette
Patricia Arquette原創
2024-10-29 12:12:29458瀏覽

How to Implement a Lock-Free Singleton in C  11 Without Mutexes?

在C 11 實現多執行緒安全單例而不使用互斥體

在C 11 中,多執行緒引入了實作單例類的新問題。雖然使用互斥體可以保證執行緒安全,但可能會影響效能。本文探討了一種在不訴諸互斥體的情況下創建無鎖單例的替代方法。

問題陳述:

我們如何在 C 11 中實現延遲初始化單例出於性能原因而不使用互斥體?

建議的解決方案:

atomic_compare_exchange_strong:

為了實現無鎖初始化,我們可以利用無鎖初始化,我們可以利用「D函數。此原子操作將 std::atomic 變數(標誌)的預期值與其所需值(desr)進行比較,如果匹配,則將變數更新為 desr。

初始化過程:

在初始化函數中,我們執行以下步驟:

  1. 將標誌設為1 表示初始化正在進行中。
  2. 使用atomic_compare_exchange_strong 檢查是否flag為1。如果是,則繼續初始化。
  3. 如果CAS成功,則flag設定為2,表示初始化成功。
  4. 如果CAS失敗,則另一個執行緒已經初始化

執行緒安全:

執行緒的並發執行通過以下措施處理:

  • 如果標誌已經是2,初始化已經完成。
  • 如果flag為0,我們嘗試使用atomic_compare_exchange_strong來初始化它。
  • 如果flag為1,則另一個執行緒正在初始化,所以當前執行緒等待。

範例實作:

<code class="cpp">class Singleton
{
public:
    static Singleton& get()
    {
        static Singleton instance;
        return instance;
    }

    static bool initialize(const string& name);
};</code>

結論:

利用使用量11 中實作多執行緒安全的單例,而無需依賴互斥體。這種方法確保在任何給定時間只有一個執行緒能夠成功初始化單例。

以上是如何在沒有互斥體的情況下在 C 11 實現無鎖單例?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn