1

アクターを使用して食事の哲学者の問題を解決する方法を理解しようとしています。ご存じないかもしれませんが、問題の核心は、スレッドが続行する前に 2 つのロックを取得する必要があることです...そして、これらの 2 つのロックを争う複数のスレッドが存在します。

アクターを使用してこれをモデル化する方法の 1 つを次に示します。

# asynchronously request locks from 2 forks (both forks are actors)
lock1 = fork1.future.lock
lock2 = fork2.future.lock

if lock1 && lock2 # wait to get both locks
  ... critical section
end

しかし、2 つのスレッドがそれぞれ 1 つのロックを持っていて、他のスレッドがそのロックを放棄するのを待っている場合、これはデッドロックになると思います。

一般に、アクターを使用してアトミックに 2 つのリソースにアクセスする方法をモデル化するにはどうすればよいでしょうか?

4

2 に答える 2

0

アクターの考え方は、同期が正しくないためにデッドロックやその他の問題が発生しないように、ロックを持たないことです。したがって、ロックをアクターと組み合わせて使用​​すると、アクターが回避することを意図していた種類の問題に跳ね返ることができます。問題は、無料のフォークと共有データをめぐる競争があることです。アクターは、共有データがない場合に非常にうまく機能します。たとえば、単純な共有データを共有するには、java.util.concurrent.ConcurrentHashMap を使用します。これは、ロックがなく、この種の問題には十分です。

現在、ConcurrentHashMap は、哲学者がフォークを置いた場合にイベントを送信しません。イベントを登録できる単純な ConcurrentMap を実装したことがあります。 ConcurrentEventMapを参照してください。MemoizingEventCalculatorTestを見て、その使用方法を確認してください。このコードを実行するには、ここからダウンロードできる JDK8 が必要です。

この ConcurrentEventMap は一時的なものです。私は ScalaSTM を使用してより良い実装を取得することに取り組んでいます ( http://nbronson.github.io/scala-stm/を参照)。これも選択肢の 1 つかもしれません。

于 2013-05-14T11:19:26.467 に答える
0

Akkaアクターを使用して Scala で記述された、この問題に対する解決策の優れた実装がここにあります

于 2013-05-13T21:49:12.103 に答える