13

IBM.comの記事によると、「競合状態とは、2 つ以上のスレッドまたはプロセスが共有データの読み取りまたは書き込みを行っている状況であり、最終的な結果は、スレッドがどのようにスケジュールされているかのタイミングによって異なります。競合状態は、予測不能な結果や微妙なプログラムのバグにつながる」. この記事は Java に関するものですが、私は一般的に同じ定義を教えられてきました。

私の知る限り、RAM からの読み取りの単純な操作は、特定の入力ライン (アドレス、読み取りなど) の状態を設定し、出力ラインの状態を読み取ることで構成されます。これは明らかに 2 つのデバイスで同時に実行することはできず、シリアル化する必要がある操作です。

ここで、いくつかのスレッドがメモリ内のオブジェクトにアクセスする状況があるとします。理論的には、競合状態を防ぐために、このアクセスはシリアル化する必要があります。ただし、たとえば、リーダー/ライター アルゴリズムでは、任意の数のリーダーが同時に共有メモリを使用できると想定しています。

ですから、問題は次のとおりです。マルチスレッド (WinAPI など) を使用する場合、読み取り用の排他ロックを実装する必要がありますか? そうでない場合、なぜですか?このコントロールはどこに実装されていますか? OS、ハードウェア?

よろしく、クバ

4

3 に答える 3

10

ハードウェア レベルでのメモリの読み取りはシーケンシャルに行われます。このレベルでは同時実行性について心配する必要はありません。2 つのスレッドが読み取り命令とすべての必要なものを発行します。アドレス バス上のアドレスの設定と実際の読み取りは、読み取りが常に正しく機能するように、メモリ アクセス ハードウェアによって実装されます。

実際、読み取り/書き込みのシナリオでも同じことが言えますが、読み取りと書き込みの要求がインターリーブされている場合、タイミングによって異なる結果が得られるため、同期が必要になります。

于 2010-04-22T13:22:58.230 に答える
4

データを変更するものがない限り、複数のスレッドから読み取っても完全に安全です。2 つの CPU (またはコア) がまったく同じクロック サイクルで読み取りのためにメモリにアクセスしようとしても、それらのアクセスはメモリ コントローラーによってシリアル化され、互いに干渉することはありません。この機能は、ハードウェアが正しく機能するために不可欠です。

于 2010-04-22T13:31:56.717 に答える
0

この質問に対する簡単な答えはありません。異なる API (および異なる環境) には、異なるレベルのマルチスレッド認識とマルチスレッドの安全性があります。

于 2010-04-22T13:23:06.620 に答える