0

A) グローバル変数 B) ローカル変数があるが、別のスレッドに ptr があるとしましょう

このコードがあるとしましょう

thread2(&localVar);//now thread2 can modify it
localVar=0;
globalVar=0;
while(1){
    mutex.lock();
    cout << (globalVar && localVar ? "Both true" : "fail");
    mutex.unlock();
    Sleep(1000)
}

これは正しく安全ですか?思い出せない。それが私の質問であれば、localVar と globalVar が変更された可能性があることを C++ がどのように認識するのでしょうか? ミューテックスのロック/ロック解除が原因だと言う場合、私の質問はなぜですか? 関数を呼び出すとき、C++ は変数が変更された可能性があり、レジスタに再ロードする必要があると考えていますか?

これが安全でない場合、安全でない理由は何ですか? (そうでない場合は、localVar だけが安全ではないと思われます)、どうすれば修正できますか?

4

3 に答える 3

2

あなたは実際よりもずっと複雑にしています。あなたの責任は、変数への競合するアクセスが発生しないようにすることです。

定義:特定のメモリ位置への2つのアクセスは、同時に発生する可能性があり、少なくとも1つが書き込みアクセスである場合に競合 します。

それで:

  • 同じメモリ位置への2回の書き込み=不良
  • 同じメモリ位置への読み取りと書き込み=不良

これが起こらないようにするには、を使用するmutexか、スレッド間で共有される変数が読み取られるようにプログラムを設計します。他にも多くの可能な戦略があります。

私があなたの不完全なコードを正しく理解している場合:localVar2つのスレッドで同時に変更されます。動作は定義されていません。何でも起れる。

于 2012-07-29T07:14:38.050 に答える
0

初めてローカル変数のアドレスを取得すると揮発性になり、すべての読み取りと書き込みがメモリで実行されると思います。

于 2012-07-29T09:36:46.593 に答える
0

これは正しくて安全ですか?

いいえ。

修正: 2 番目のスレッドを作成する前に、localVar と globalVar を初期化します。

localVar (ローカルスタック上? local var はスコープ内のスタック上で提案する) を別のスレッドに公開したことは面倒です。この localVar がスタック上にある場合は、範囲外にならないように注意してください。

読み取り/書き込みアクセスを保護するために、他のスレッドで同じミューテックスを使用していますか? はいの場合、これは安全に向かっています。

「C++ は、localVar と globalVar が変更された可能性があることを認識していますか?」という問題ではありません。C++ は認識していません。この状況では、説明したように、ミューテックスを使用して、すべての共有値へのすべてのアクセスを適切に保護することがすべてです。両方のスレッドでミューテックスが使用されている場合、一度に 1 つのスレッドのみがミューテックスを通過して保護されたコードに入ることができます。ミューテックスをロックしようとする他のスレッドは、ロックが解放されるまで「停止して待機」します。

したがって、値のペアの読み取りをミューテックスで囲むことで、正しい軌道に乗っています。

関数を呼び出すとき、C++ は変数が変更された可能性があり、レジスタに再ロードする必要があると考えていますか?

原則として、はい。

于 2012-07-29T07:18:30.417 に答える