首页  >  文章  >  后端开发  >  在 C 11 中,使用原子操作的无锁单例是比使用互斥体更好的方法吗?

在 C 11 中,使用原子操作的无锁单例是比使用互斥体更好的方法吗?

Susan Sarandon
Susan Sarandon原创
2024-10-31 21:21:02428浏览

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

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