我刚读了this有关当前boost::mutex实现背后的实际原因的文章,并注意到以下短语:
块范围静态变量还存在潜在的“第一次通过”竞争条件问题,这可能导致在流行编译器上多次运行析构函数,这是未定义的行为。编译器通常使用类似于调用atexit的方式来确保按照构造顺序执行销毁操作,而可能导致构造函数运行两次的初始化竞争也可能导致析构函数注册两次。
这是真的吗?我真的应该检查另一个线程是否已经通过原子操作或类似方法进入此对象的析构函数吗?即使在C++11-C++14中也应该这样做吗?因为据我所知,自C++11以来就不再存在“同时可以从几个线程调用具有静态存储期的相同本地对象的构造函数”的问题了--它要求其他线程应等待构造函数完成。我是对的吗?
块范围静态变量还存在潜在的“第一次通过”竞争条件问题,这可能导致在流行编译器上多次运行析构函数,这是未定义的行为。编译器通常使用类似于调用atexit的方式来确保按照构造顺序执行销毁操作,而可能导致构造函数运行两次的初始化竞争也可能导致析构函数注册两次。
这是真的吗?我真的应该检查另一个线程是否已经通过原子操作或类似方法进入此对象的析构函数吗?即使在C++11-C++14中也应该这样做吗?因为据我所知,自C++11以来就不再存在“同时可以从几个线程调用具有静态存储期的相同本地对象的构造函数”的问题了--它要求其他线程应等待构造函数完成。我是对的吗?