2012-12-28 14 views
5

のは、私が持っているとしましょう:私は型ベースのオブジェクトを作成する2つの独立したスレッド上で、メソッドは、スレッドセーフと見なされるfならば今スレッドセーフと静的関数

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

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

    int d; 
}; 

を? 私が知っていることは、メソッドがスレッドセーフであるためには、静的メンバーもグローバル変数も使用しないでください。しかし、上の例からわかるように、変数dを静的にしないことにしました。代わりに、実行中のbaseのインスタンスを通して呼び出します。

また、私はこの行を保護する必要はないと考えています:(b->d)++; mutexを使って各スレッドはbaseと変数dの別々のインスタンスを持つためです。

私の分析では正しいですか?私は注意すべきことは何かありますか?

+1

あなたは正しいです。ベースポインタがスレッド固有である限り、あなたは良いです。 – perreal

+0

プログラムをコンパイルできますか?それはコンパイルエラー – stamhaney

+0

@stamhaneyをスローする必要があります。いいえ、私は理論を解決しようとしています:)問題点を指摘してください。 – Kam

答えて

7

はい、コンストラクタはインスタンス変数(具体的にはd)にのみアクセスするため、スレッドセーフです。初期化されていないdからインクリメントを実行するが、スレッドの安全性とは何の関係もないため、未定義の動作を示します。ここで

あなたは未定義の動作を修正することができる方法です。

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

dは、初期化子リストで初期化されていることを、あなたのプログラムは、予測可能な方法で動作します。

+0

ありがとうございます:)これは完璧です – Kam

関連する問題