3

マルチコア システムで並列処理を利用しているとします。

同じ命令が同時に実行される可能性は完全にありませんか?

次のコードを使用します。

int i = 0;

if( blockingCondition )
{
  lock( objLock )
  {
    i++;
  }
}

私の頭の中では、複数のコアと並列処理を備えたシステムでは、blockingCondition が正確に同時にチェックされ、同時にロックが試行されるなどの可能性が非常に高いようです...真実?

もしそうなら、どうすればプロセッサ間の同期を保証できますか?

また、.net TPL はこのタイプの同期を処理しますか? 他の言語はどうですか?

編集これはスレッドに関するものではなく、タスクと並列処理に関する ものであることに注意してください。

EDIT 2 OK、情報をありがとう。では、OS がメモリへの書き込みがシリアル化され、揮発性読み取りによるマルチコア同期が保証されるというのは本当ですか?

4

3 に答える 3

2

これが機能する理由を理解するには、次の点に注意してください。

  1. ロックのロック (つまり、オブジェクトのロック セマフォのインクリメント) は、オブジェクトが既にロックされている場合にブロックする操作です。

  2. a) ロックセマフォが解放されているかどうかをlock確認する、b) オブジェクトを実際にロックする、という 2 つの手順が「同時に」実行されます。

したがって、if2 つのスレッドが -block に入ると、2 つのスレッドのうちの 1 つがロックを取得し、もう 1 つのスレッドは最初のスレッドがif.

于 2010-10-10T11:02:20.397 に答える
1

あなたの懸念はまさにlock、ブール値フラグのような特別なメカニズムが必要であり、単純に使用できない理由です。

lock「同時」の問題の解決策は、 (を呼び出すMonitor.Enter())が使用するアルゴリズムにあります。2 つのスレッドが同時にロックを取得できないようにするために、メモリ バリアと非常に低レベルのメモリ メカニズムに関する知識が必要です。

注: Java ではなく、.NET のみについて話しています。

于 2010-10-10T11:10:59.490 に答える
1

ここで説明したようなロックは、objLockの「 Monitor 」スタイルのロックです。お気づきのように、マルチコア システムでは、2 つの「ロック」呼び出しが同時に開始される可能性は十分にあります。ただし、モニターを使用する高レベルのアプリケーション環境では、コンパイルされたバイトコードでモニターがセマフォ要求 (または、OS と言語の詳細によってはミューテックス要求) に変換されます。

セマフォはオペレーティング システムやハードウェア レベルで実装され、高レベルの言語がそれらにバインドされます。OS レベルでは、それらはアトミックであることが「保証」されています。つまり、セマフォを取得するプログラムは、その時点で唯一のセマフォであることが保証されます。2 つのプログラム、またはプログラム内の 2 つのスレッドが同時にロックを取得しようとすると、一方が最初にロックを取得 (および成功) し、もう一方が 2 番目にロックを取得 (および失敗) します。

この時点で、「同期を確実にする方法」は、アプリケーション プログラマーが心配する問題ではなくなり、オペレーティング システムの設計者とハードウェアの設計者にとって問題になり始めます。

その結果、アプリケーション コーダーとして、システムに接続する CPU の数に関係なく、"lock(objLock)" はアトミック コールであると安全に想定できます。

于 2010-10-10T11:16:33.560 に答える