0

私はこのコードを持っています、それは相互排除アルゴリズムです

turn = 0 // shared control variable    

while (turn != i);

// CS

turn = (turn + 1) % n;

私はスレッドがどのように機能するかを知っていますが、実際にはJavaでスレッドを使用するのは少し弱いので、Javaのスレッドを使用して実際のコードでスレッドを変換する方法を理解するのに役立つ提案をお願いします

私の悪い英語でごめんなさい

4

2 に答える 2

4

相互排除は、通常、最も単純な形式で、メソッドを同期としてマークすることによって実現されます。オブジェクトのメソッドを同期済みとしてマークすることにより、一度に1つのスレッドのみがそのオブジェクトのメソッドを実行できます。メソッドを所有するオブジェクトはモニターです。

さらに、コード自体に同期ブロックを定義して、モニターとして機能するオブジェクトを渡すことができます。

実行したいロジックを持つRunnableオブジェクトを定義することで、同じことをより簡単に実現できると思います。相互排除が必要な場合は、同期メソッドを定義します。

次に、そのRunnableインスタンスを必要な数のスレッドに渡すことができます。それらはすべて同じRunnableを参照するため、同期されたメソッドへの呼び出しは相互に排他的です。

これが唯一の方法ではありませんが、それはあなたが求めているものでなければなりません。お役に立てれば。

于 2013-02-10T22:09:37.347 に答える
0

このコードは相互に排他的ではありません。この実行を検討してください-

  1. スレッド0はコードとCSを入力し、最後の行で増分が1になります。
  2. スレッド1は、ターンが1に等しいときにCSに入り、そのままになります。
  3. これで、スレッド0は最初の行に戻り、ターンを0に設定してから、スレッド1と一緒にCSに入ります。
于 2013-02-12T16:49:51.223 に答える