6

C++ のさまざまなスレッドからアクションを実行する必要があるオブジェクトがいくつかあります。同時に複数のスレッドで使用される可能性のある変数をロックする必要があることは知っていましたが、各スレッドが同じオブジェクトの異なるデータ メンバーにアクセス (書き込み) している場合はどうなるでしょうか? たとえば、各スレッドがオブジェクトの異なるメソッドを呼び出しており、呼び出されたどのメソッドも同じデータ メンバーを変更していません。同じデータメンバーにアクセスしない限り安全ですか、それともオブジェクト全体をロックする必要がありますか?

このトピックの説明と詳細を調べましたが、すべての例は単一の変数または非メンバー関数に焦点を当てているようです。

要約すると、オブジェクト全体をロックせずに、2 つの異なるスレッドから同じオブジェクトの 2 つの異なるデータ メンバーに安全にアクセスできますか?

4

6 に答える 6

4

これは事実上安全ですが、頻繁に行うとコードのパフォーマンスが大幅に低下します。コンピュータは「キャッシュ ライン」と呼ばれるものを使用します。2 つのプロセッサが同じキャッシュ ラインで動作している場合、常にキャッシュ ラインをやり取りする必要があり、作業が遅くなります。

于 2012-04-26T13:54:25.017 に答える
2

はい、異なるスレッドで 1 つのオブジェクトの異なるメンバーにアクセスしても安全です。

于 2012-04-26T13:54:30.987 に答える
1

私はあなたがそれをうまく行うことができると思います。ただし、同じデータにアクセスするためにメソッドの内部が変更されないこと、または呼び出し元のプログラムが別のスレッドが既に使用している別のメソッドを呼び出すことを決定しないことなどを確認してください。

可能性はありますが、潜在的に危険です。ただし、ミューテックスを取得するための呼び出しを回避するため、高速になります。あなたの毒を選んでください。

于 2012-04-26T13:55:57.383 に答える
0

同じデータメンバーにアクセスしない限り安全ですか、それともオブジェクト全体をロックする必要がありますか?

答えはクラスの設計に完全に依存しますが、複数のスレッドが同じオブジェクトにアクセスできるようにする前に、常に 100 回考えることが推奨されます。事実を考えると、データが本当に独立していると確信している場合、オブジェクト全体をロックする必要はありません。

「変数が本当に独立しているのなら、なぜそれらは同じクラスにあるのか?」という別の疑問が生じます。スレッドが間違っている場合は注意してください。

于 2012-04-26T13:58:34.857 に答える
0

注意したいことがあります。たとえば、 http: //gcc.gnu.org/ml/gcc/2012-02/msg00032.htmlを参照してください 。フィールドへのアクセス方法によっては、同様の見つけにくい問題に遭遇する可能性があります。

于 2012-04-26T14:30:05.017 に答える
0

はい、できますが、他の人が指摘しているように、そうする必要はありません。IMHO、データメンバーへのアクセスはゲッター/セッターメソッドを介して行う必要があるため、必要なミューテックス/クリティカルセクション/セマフォリング/何でもオブジェクト内にカプセル化されます。

于 2012-04-26T14:04:01.093 に答える