2012-12-28 70 views
5

讓我們假設我有一個:線程安全和靜態函數

class base 
{ 
    base(){f(this);}; 

    static void f(base * b) {(b->d)++;}; 

    int d; 
}; 

現在,如果在2個單獨的線程創建型基地的目標,將方法f被認爲是線程安全的? 我在問這個問題,因爲通常從我所知道的是一個方法是線程安全的,它不應該使用靜態成員或全局變量。但是從上面的示例中可以看出,我決定不使變量d爲靜態,而是通過base的運行實例調用它。

此外,我認爲我不需要保護這一行:(b->d)++;與互斥體,因爲每個線程將有一個單獨的基地實例和變量d。

我的分析正確嗎?有什麼我應該注意的嗎?

+1

你是正確的,只要基本指針是線程特定的你是好的。 – perreal

+0

你能編譯你的程序嗎?它應該吐出編譯錯誤 – stamhaney

+0

@stamhaney,不,我沒有我只是試圖找出理論:)請指出問題雖然 – Kam

回答

7

是的,你的構造函數是線程安全的,因爲它只訪問實例變量(具體來說,d)。它確實表現出未定義的行爲,因爲它從未初始化的d中讀取以執行增量,但與線程安全無關。

這裏是你如何解決未定義的行爲:

base(): d(0) {f(this);}; 

現在d在初始化列表初始化,你的程序在可預見的方式表現。

+0

謝謝:)這是完美的 – Kam