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