了评论What's wrong with this fix for double checked locking?说:可以在构造函数被调用之前完成赋值工作吗?
的问题是,该变量可以是 分配的构造函数运行 (或完成)之前,而不是对象 分配之前。
让我们考虑代码:
A *a;
void Test()
{
a = new A;
}
,以便更正式的分析,让我们分裂A =新的A到几个操作:
void *mem = malloc(sizeof(A)); // Allocation
new(mem) A; // Constructor
a = reinterpret_cast<A *>(mem); // Assignment
是上面真引述评论,如果是,从何种意义上说?作业后可以执行构造函数吗?如果可以的话,由于MT安全需要保证订单时可以采取什么措施?
对不起。修复了代码。 – Suma 2009-06-17 22:00:59
没有什么可以对付它,真的。你将不得不做任何读取和写入volatile,并且必须使“mem”变得不稳定,以便将代码保存在你的代码写入的顺序中,并且所有这些写入/读取都由一个序列点分开。但是这仍然不会做任何w.r.t多线程:标准不知道它。 – 2009-06-17 22:01:54