2011-12-22 11 views
0

これは非常に概念的な質問です。2つのスレッドの相互作用が遅くなっていますか?

私は別々のスレッドが2つあるとしましょう。スレッドAは継続的に時間を取得し、それを変数として格納し、スレッドBはスレッドBの変数から時間を絶えず取得し、何かを行います。

スレッドBがスレッドAの変数にアクセスすると、スレッドAは操作が終了するまで実行を停止しますか?

3つのスレッドがある場合、スレッドAは現在の時刻を取得し、スレッドBの変数として設定し、スレッドCは変数を読み込むようにします。

スレッドCが変数を割り当てる途中にある場合、スレッドCはスレッドAが終了するまで実行を停止しますか?

大きな回答ありがとうございますが、今はもう1つ質問があります。それらが干渉する場合は、複数のスレッドが通信する際に競合しないようにするための推奨ソリューションは何ですか。 (概念的に)あなたはそれを作るために何をして、これらのスレッドが可能な限り個別にできる限り変数の値を共有できるようにしますか?

+0

「スレッドAの変数」とはどういう意味ですか?スレッドローカル変数を意味しますか? –

答えて

4

メモリとthradsは全く異なる2つのものです。スレッドを表すクラスの一部である変数であっても、スレッドがアクセスできる他のメモリと同様のメモリです。

しかし、これを複雑にし、実際にはプロセッサキャッシュが減速する原因となります。異なるCPU上で実行されている2つのスレッドが同じメモリにアクセスしてお互いの変更を見るためには、CPUキャッシュはこれらのキャッシュの(大規模な)速度の利点を完全に無効にすることができます。

キャッシュのために、同期ブロック内の変数にアクセスするか、変数volatileで変数が宣言されていない限り、スレッドBは実際には変数の古い値を任意の長時間参照することがあります。

0

OSやCPUの数によって異なりますが、基本的には1つのスレッドが動作しているときには、もう1つは待機します。スレッドBが同じメモリを共有するので、スレッドAが使用する変数を使用するかどうかは関係ありません。

3

ゲッターとセッターの同期を宣言しない限り、通常はそうではありません。つまり、セッターがあるスレッドから呼び出され、別のスレッドがゲッターにアクセスしたい場合、他のスレッドが最初にタスクを終了するのを待たなければなりません。

私は正しい質問を理解していただきたいと思います。

0

はいそれは遅くなります。

これは、ロックされた変数へのアクセスを規制するためにロック、セマフォ、モニタなどを持っているため、各スレッドが読み取り/書き込みアクセス権を取得するために待機する可能性があるため、変数を記述します。

並行性チェックをしていない場合でも、メモリが同時読み書きを許可していないことを確信しています。この状況が発生する可能性があるため、スレッドは少し遅くなります。

1

スレッドBがスレッドAを遅くすることはありません。

but:
1.スレッドAがスレッドBを遅くする可能性があります。システムアーキテクチャ(コアとキャッシュ)に応じて、スレッドAによるすべての書き込みは、スレッドBのCPUからのキャッシュラインをパージします。 Bの次の読みはより高価になります。
2.データ構造を保護するためにロックを使用する場合は、両方のスレッドがロックを取得する必要があります。そして、明らかにスレッドAは遅くなります。
3.ロックを使用せず、データ型がアトミックでない場合、破損したデータを読み取ることがあります。たとえば、時刻が0x0000ffffから0x00010000に変更された場合、0x0001ffffを読み取ることができます。通常、4バイトに整列された整数はアトミックなので、時間がtime_tの場合はおそらくOKです。しかし、詳細はプラットフォームに依存します。

関連する問題