2013-12-24 44 views
-1

1. 幾天前我發佈了問題(About thread-safety of weak_ptr),現在我有其他相關問題。 如果我這樣做,將引入競爭條件,如上面的例子g_w?(我的平臺是毫秒vs2013)關於weak_ptr的競賽條件

std::weak_ptr<int> g_w; 

void f3() 
{ 
    std::shared_ptr<int>l_s3 = g_w.lock(); //2. here will read g_w 
    if (l_s3) 
    { 
     ;/..... 
    } 
} 

void f4() //f4 run in main thread 
{ 
    std::shared_ptr<int> p_s = std::make_shared<int>(1); 
    g_w = p_s; 

    std::thread th(f3); // f3 run in the other thread 
    th.detach(); 
    // 1. p_s destory will motify g_w (write g_w) 
} 

2.As我知道的std :: shared_ptr的/ weak_ptr的衍生的std :: TR1 :: shared_ptr/weak_ptr和從boost :: shared_ptr/weak_ptr派生的std :: tr1 :: shared_ptr/weak_ptr,實現上是否有區別,特別是在線程安全的情況下。

+0

p_s'的'破壞將不會修改'g_w'。它不會寫入'g_w'。 –

回答

1

一個std::thread的竣工同步與線程指定的函數被創建的,即一切這種情況發生在f4std::thread th施工前保證是可見的新線程啓動時調用執行f3。特別是f4g_w = p_s;)中的g_w的寫入對於f4中的新線程將是可見的。

您的評論// 1. p_s destory will motify g_w (write g_w)中的聲明不正確。以任何方式銷燬p_s不會訪問g_w。在大多數實現中,它會修改用於跟蹤指向對象的所有共享和弱引用的公共控制塊。對標準庫實現內部對象的任何這樣的修改都是庫的問題,而不是你自己的問題,而不是你自己,每個C++ 11§17.6.5.9/7「如果對象不可見,實現可以在線程之間共享它們自己的內部對象用戶,並受到數據競爭的保護。「

假設沒有在程序的其他地方對g_w進行同時修改,也沒有其他線程正在執行f3,所以此程序在g_w上沒有數據競爭。

+0

對於添加評論的空間太有限,無法表達我的意見,因此我將我的問題作爲其他答案發布。 –

0

@Casey

首先,我完成我的代碼。

​​

而且我發現在我的Visual Studio中的一些代碼2013 Is there a race?

+0

如果你看看'weak_ptr'賦值操作符,你應該看到'weak_ptr'通過遞增'_Weaks'來保存對控制塊的引用。當最後一個'shared_ptr'被銷燬時,共享對象可能被釋放,但帶有引用計數的控制塊將一直存在,直到最後一個* weak *指針被銷燬。 – Casey

+0

真的,謝謝你的幫助。我只是注意到_Uses,但不是_Weaks.So在其他問題(http://stackoverflow.com/questions/20705304/about-threadsafe-of-weak-ptr)我只打電話給f4 ()主要沒有比賽,對嗎? –