6

私が持っているとしましょう:

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

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

    int d;
};

2 つの別々のスレッドで base 型のオブジェクトを作成した場合、メソッドfはスレッドセーフと見なされますか? 通常、私が知っていることから、メソッドをスレッドセーフにするためには、静的メンバーもグローバル変数も使用しないでください。しかし、上記の例からわかるように、変数をdstatic にしないことに決めました。代わりに、base の実行中のインスタンスを介して呼び出します。

また、この行を保護する必要はないと思います :(b->d)++;各スレッドはベースと変数 d の個別のインスタンスを持つため、ミューテックスを使用します。

私の分析は正しいですか?何か気をつけることはありますか?

4

1 に答える 1

8

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

未定義の動作を修正する方法は次のとおりです。

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

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

于 2012-12-28T05:22:48.450 に答える