3

私の教科書には次のように書かれています。

プロセス内のすべてのスレッドは、同じデータ (共有) にアクセスできます。

ただし、各スレッドには独自のスタックがあります。これは、ローカル変数が共有されていないことを意味します。では、どのような種類のデータ スレッドを共有できるのでしょうか。

アップデート:

各スレッドがグローバル変数を共有できることがわかりました。混乱しました。グローバルグローバル変数は静的スタックであり、各スレッドが独自のスタックを持っていることによって共有されるべきではありません。

4

5 に答える 5

2

各スレッドがグローバル変数を共有できることがわかりました。混乱しました。グローバルグローバル変数は静的スタックであり、各スレッドが独自のスタックを持っていることによって共有されるべきではありません。

スタックについて考えすぎています。dataまたはなどの他のメモリ領域がありますbss。静的ストレージを持つオブジェクト (グローバル変数や修飾子で宣言されたものなどstatic) は、すべてのスレッド間で共有されます。

また、頑張ってみると、すべてのスレッドがすべてにアクセスできるため、別の「スタック」について特別なことは何もありません。スレッドが別の「スタック」上の場所へのポインターを取得できた場合、スレッドはそれを自由に読み取ったり、変更したりできます。

これらすべての要点は、スレッドが変数を共有するだけではないということです。それらは単に同じ仮想メモリ空​​間にあります。

于 2012-08-07T13:58:28.617 に答える
1

@cnicutar は静的ストレージについて正しいです。実際、これについては別の質問で良い議論があります。その質問のタイトルにもかかわらず、そこにある回答(特に最初の2つ)はあなたの質問にうまく答えており、私はもっとうまくやれるとは思いません.

于 2012-08-07T14:10:23.050 に答える
0

静的データが各スレッドに割り当てられるとは思いません。これは一度だけインスタンス化され、execute()メソッドでその静的データを宣言しているすべてのスレッドにアクセスできます。

于 2012-08-07T14:24:25.597 に答える
0

前述のように、各スレッドには独自のスタックがあります。したがって、このスタック上のデータは、それを所有しているだけなので、スレッドセーフであると言われています。

All threads within a process have access to the same data (share)

それが示すように、複数のスレッドが同じデータにアクセスできます。共有されているリソースへのスレッドの同期 (クリティカル セクション、ミューテックスなど) について考え始める必要があるため、これは小さな警鐘を鳴らす必要があります。

すべてのスレッドが同じヒープにアクセスできるため、new 演算子によってヒープに割り当てられたリソースは共有されます。

于 2012-08-07T14:07:10.253 に答える