在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中文網其他相關文章!