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