首頁 > 後端開發 > C++ > 在 C 11 中,使用原子操作的無鎖單例是比使用互斥體更好的方法嗎?

在 C 11 中,使用原子操作的無鎖單例是比使用互斥體更好的方法嗎?

Susan Sarandon
發布: 2024-10-31 21:21:02
原創
490 人瀏覽過

Is a Lock-Free Singleton with Atomic Operations a Better Approach in C  11 Than Using Mutexes?

在C 11 實現多執行緒單例

隨著C 11 多執行緒功能的出現,使用互斥體實作單例的傳統方法可能不再適用出於性能原因,不再需要。

具有原子操作的無鎖單例

創建不帶互斥鎖的單例的一種方法是透過原子操作。使用原子bool 變數和std::atomic_compare_exchange_strong() 函數,您可以實現以下解決方案:

<code class="cpp">public class Singleton {
    private static atomic<int> flag = 0;
    private static string name;

    public static bool initialized() {
        return (flag == 2);
    }

    public static bool initialize(string name_) {
        if (flag == 2) {
            return false; // Already initialized
        }
        int exp = 0, desr = 1;
        bool willInitialize = std::atomic_compare_exchange_strong(&flag, &exp, desr);

        if (!willInitialize) {
            return false; // Another thread CASed before us
        }
        initialize_impl(name_);
        assert(flag == 1);
        flag = 2;
        return true;
    }

    private static void initialize_impl(string name) {
        name = name;
    }
}</code>
登入後複製

C 11 執行緒安全初始化

C 11引入了線程安全的靜態初始化,無需手動鎖定。並發執行等待靜態局部變數被初始化,允許以下簡化實現:

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

Singleton 的替代品

需要注意的是,雖然這些解決方案儘管提供多線程安全的單例實現,單例模式本身並不總是最佳的設計選擇。考慮替代方案,例如將物件作為函數參數傳遞、使用依賴注入或採用狀態模式。

以上是在 C 11 中,使用原子操作的無鎖單例是比使用互斥體更好的方法嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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