首页  >  文章  >  后端开发  >  如何在没有互斥体的情况下在 C 11 中实现多线程单例?

如何在没有互斥体的情况下在 C 11 中实现多线程单例?

Patricia Arquette
Patricia Arquette原创
2024-11-03 13:42:30676浏览

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn