首頁 > 後端開發 > C++ > 主體

如何在沒有互斥體的情況下在 C 11 中實作多執行緒單例?

Patricia Arquette
發布: 2024-11-03 13:42:30
原創
675 人瀏覽過

How to Implement a Multithreaded Singleton in C  11 Without Mutexes?

在C 11 實現不帶互斥的多執行緒單例

隨著C 11 中多執行緒功能的引入,出現瞭如何實現單例的問題不利用互斥體來優化效能。建議的方法涉及使用原子變數和 std::atomic_compare_exchange_strong() 函數:

<code class="cpp">class Singleton
{
public:
    static bool isInitialized() { return (flag == 2); }
    static bool initizalize(const string& name_)
    {
        if (flag == 2)
            return false;
        if (flag == 1)
            return false;
        int exp = 0;
        int desr = 1;
        bool willInitialize = std::atomic_compare_exchange_strong(&flag, &exp, desr);
        if (!willInitialize)
        {
            cout << "Somebody else CASed at aprox same time" << endl;
            return false;
        }
        else
        {
            initialize_impl(name_);
            assert(flag == 1);
            flag = 2;
            return true;
        }
    }
    static void clear()
    {
        name.clear();
        flag = 0;
    }

private:
    static void initialize_impl(const string& name_) { name = name_; }
    static atomic<int> flag;
    static string name;
};</code>
登入後複製

原子變數和 std::atomic_compare_exchange_strong() 函數可確保執行緒安全,而不會引入執行緒同步開銷。然而,這種方法仍然需要仔細處理,以防止資料爭用並確保正確的初始化。

C 11 標準強制執行初始化安全性

有趣的是,C 11 標準消除了某些情況下需要手動鎖定。以下程式碼片段利用了此行為:

<code class="cpp">static Singleton& get() {
  static Singleton instance;
  return instance;
}</code>
登入後複製

嘗試初始化靜態變數實例的並發執行將隱式等待其完成,從而減少潛在的競爭條件。

單例反-模式

雖然上述方法提供了多執行緒單例實現的解決方案,但值得注意的是,通常不鼓勵使用單例。它們會引入耦合、狀態依賴性和複雜的單元測試。替代設計模式通常更適合管理共享資源和依賴項。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板