正如之前在this问题中所讨论的那样,当多个线程同时为具有静态存储持续时间的同一对象调用构造函数时,预C ++ 11实现可以执行代码。
在boost::mutex
实现中,从其构造函数调用的initialize
函数包含以下代码:
void initialize()
{
active_count=0;
event=0;
}
好吧,对我而言,它似乎是UB,因为当多个线程同时将0
写入同一个内存区域时,我们可能会遇到这种情况,不是吗?
答案 0 :(得分:3)
是。如果您在不同线程的同一内存位置同时构造一个互斥锁,那么您将调用UB。
当然,这种情况真的很难实现。
<强>更新强>
好的,显而易见的是,问题是关于函数局部静态初始化c ++ 11的初始化。虽然这与boost :: mutex无关,但我可以确认,boost::mutex
构造确实对于这样的情况也是不安全的。
(协调对共享资源的访问的互斥锁通常需要在访问资源之前。当互斥锁本身在创建之前是共享资源时,你做错了。
如果您甚至需要执行此类操作,则需要现有同步来协调对构造新互斥锁的位置的访问。)