了評論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