1

ここに仮説がありますが、検証するのは少し難しいです。

2 つのスレッドが同じオブジェクト インスタンスの同じメソッドを呼び出す場合、呼び出しスレッドごとに固有のスタック フレームはありますか? コンパイルされたバイナリでは、クラスはメモリ内の関数定義で満たされた静的コードセクションであると理解しています。異なるオブジェクト間の唯一の違いは、this内部で渡されるポインターです。

ただし、それを呼び出すスレッドは独自のスタック フレームを持っている必要があります。そうしないと、2 つのスレッドが同じオブジェクト インスタンスの同じメンバー関数にアクセスしようとすると、互いのローカル変数が壊れてしまいます。

ここで繰り返しますが、2 つのスレッドがthis同時に変更することでオブジェクト データが破損する可能性があるかどうかについては言及していません。2 つのスレッドが同じインスタンスの同じメソッドに同時に入る場合、そのコンテキストのローカル変数がメモリ内の同じ場所にあるかどうかについては、さらに詳しく調べています。繰り返しますが、そうではないというのが私の仮定です。

4

3 に答える 3

0

異なるスレッドには固有のスタックがあることは正しいです。これは c++ や cpp の機能ではなく、OS によって提供される機能です。クラスオブジェクトが異なる必要はありません。これは、割り当て方法によって異なります。異なるスレッドがヒープ オブジェクトを共有する可能性があり、これが同時発生の問題につながる可能性があります。

于 2013-10-15T04:43:42.243 に答える
0

関数またはクラスメソッドのローカル変数は、それぞれの独自のスタック (実際にはスレッドのスタック、スタックフレームに配置) に格納されるため、どのスレッドからメソッドを呼び出すかは問題ではありません。実行中に独自のスタックを使用します。各通話

少し異なる説明:各メソッド呼び出しは独自のスタック(またはより良いスタックフレーム)を作成します

注: 静的変数は同じになります

もちろん、実行中に別のメソッドのスタックメモリにアクセスするテクニックはありますが、ちょっとしたハックがあります

于 2013-10-15T04:44:09.867 に答える