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