构造静态函数范围对象是否是线程安全的?

Ale*_*nov 5 c++

假设我有一个函数试图使用以下代码保护全局计数器:

 static MyCriticalSectionWrapper lock;
 lock.Enter();
 counter = ++m_counter;
 lock.Leave();
Run Code Online (Sandbox Code Playgroud)

是否有可能两个线程将调用其lock构造函数?实现这一目标的安全方法是什么?

Mic*_*eyn 4

锁对象的创建本身并不是线程安全的。根据编译器的不同,如果多个线程(几乎)同时进入该函数,则可能会创建多个独立的锁对象。

该问题的解决方案是使用:

  • 操作系统保证一次初始化(对于锁对象)
  • 双重检查锁定(假设对于您的特定情况来说是安全的)
  • 锁对象的线程安全单例
  • 对于您的具体示例,您可以使用线程安全互锁(例如,Windows 的 InterlockedIncrement() 函数)操作进行增量并完全避免锁定

  • AFAIK,双重检查锁定不被认为是线程安全的。这是一种反模式。 (5认同)