2016-09-01 23 views
1

内部に関数を通過する複数のスレッドがある場合、内部に変数の代入を持つforループがあります。変数の値が複数のスレッド間でどのように混乱することはありませんか?メモリはスレッド内でどのように管理されますか?

+0

*同じ*スレッドが同じ関数の2回の実行の途中にある場合(例えば、関数が再帰的な場合など)、メモリが混乱することはありません。なぜ2つのスレッドが関数を実行していたのですか? – user2357112

+1

関数のコードだけでアクセスできる関数のローカル変数、またはプログラム全体の他のコードからアクセス可能なグローバル変数を参照していましたか?ローカル変数を意味するなら、すべてのスレッドはその中の_copy_を受け取ります。グローバル変数を意味する場合は、もちろん、特別な予防措置を講じない限り、複数のスレッドが値を混乱させる可能性があります。 –

+0

単一のスレッドが同じ機能を2度同時に実行する場合と同じ方法です(再帰など)。 –

答えて

0

各スレッドには、「スレッドスタック」という名前のメモリブロックがあり、パラメータまたは中間結果である値の型と参照(ヒープへのポインタ)が格納されます。32ビットで約1MB、64ビットで4MBです。このスペースはスレッド間で共有されません。残りのもの(つまり、共有された値の型と参照、および参照が参照される可能性のあるオブジェクト)はヒープに格納されます。これは残りのRAMメモリであり、すべてのスレッドで共有されます。

競合状態など、スレッド間で値が混乱する可能性があります。複数のスレッドから64ビットの値を32ビットのCPUで更新しようとすると、たとえば、InterlockおよびMonitorユーティリティのように、.NETで多くの同期プリミティブが発生するのを防ぐために、矛盾が発生する可能性があります。また、List<>のようなスレッドセーフではないオブジェクトは、同期なしで複数のスレッドを使用すると混乱する可能性があります。単純な整数のインクリメントは、操作がアトミックでない場合は値を失う可能性があります。

読んでください。私はあなたに、Jeffrey RichterのC#経由でCLRをお勧めします。すべての.NET開発者は実際にその本を読むべきです。

関連する問題