在 boost::mutex 构造函数中同时写入同一内存区域可能存在错误
Possible bug with simultaneous write to the same memory region in boost::mutex constructor
正如之前在 问题中讨论的那样,当多个线程同时调用具有静态存储持续时间的同一对象的构造函数时,C++11 之前的实现可以以这种方式执行代码。
在 boost::mutex
实现中有 initialize
函数从其构造函数调用并包含以下代码:
void initialize()
{
active_count=0;
event=0;
}
嗯,在我看来这是 UB,因为我们可能会遇到多个线程同时将 0
写入同一内存区域的情况,不是吗?
是的。如果您同时从不同线程在同一内存位置构造一个互斥体,那么您就是在调用 UB。
当然,那个场景真的很难实现。
更新
好的,很明显问题是关于 c++11 之前的函数局部静态的初始化。虽然这与 boost::mutex 本身无关,但我可以确认 boost::mutex
构造对于这种情况确实也是不安全的。
(协调对共享资源的访问的互斥体通常需要先于对资源的访问。当互斥体本身在创建之前是共享资源时,你就错了。
如果您甚至需要做这样的事情,您需要现有的同步来协调对您构造新互斥体的区域的访问。)
正如之前在
在 boost::mutex
实现中有 initialize
函数从其构造函数调用并包含以下代码:
void initialize()
{
active_count=0;
event=0;
}
嗯,在我看来这是 UB,因为我们可能会遇到多个线程同时将 0
写入同一内存区域的情况,不是吗?
是的。如果您同时从不同线程在同一内存位置构造一个互斥体,那么您就是在调用 UB。
当然,那个场景真的很难实现。
更新
好的,很明显问题是关于 c++11 之前的函数局部静态的初始化。虽然这与 boost::mutex 本身无关,但我可以确认 boost::mutex
构造对于这种情况确实也是不安全的。
(协调对共享资源的访问的互斥体通常需要先于对资源的访问。当互斥体本身在创建之前是共享资源时,你就错了。
如果您甚至需要做这样的事情,您需要现有的同步来协调对您构造新互斥体的区域的访问。)