1. ホーム
  2. multithreading

[解決済み] スレッドと比較して、アクターはどのように動作するのですか?

2023-03-19 21:15:47

質問

どのようにすれば良いのか、簡単な説明はありますか? アクター がスレッドと比較してどのように機能するかについて、良い簡潔な説明はありますか?

スレッドはアクターとして見ることができ、他のスレッドにメッセージを送ることはできないのでしょうか?私はいくつかの違いを見ますが、それは私にとってそれほど明確ではありません。私は アクター を使うことはできますか?

どのように解決するのですか?

アクターモデルはメッセージパッシングで動作します。 個々のプロセス (アクター) は、互いに非同期でメッセージを送信することが許可されています。 私たちが通常スレッド モデルとして考えているものと異なるのは、(少なくとも理論的には)共有状態が存在しないことです。 そして、共有状態がすべての悪の根源であると (正当な根拠をもって) 信じているならば、アクター モデルは非常に魅力的なものになります。

しかし、興奮しすぎるのはよくありません。 アクター モデルは、(いくつかの主張に反して) デッドロックの発生を不可能にするものではありません。 また、アクターモデルは、異なるプロセス間でリソースの競合が発生するのを防ぐものでもありません (たとえば、メッセージ キューなど)。 このモデルは、あるレベル以上ではロックフリーであるに過ぎません。 より低いレベルでは、メッセージキューを調整するために、ロックはまだ必要です。

スレッドをアクターとして見て、他のスレッドにメッセージを送ることはできないのでしょうか?

まあ、イエスでもありノーでもあります。 いいえ、単に共有メモリ位置にミューテックスを置くというアプローチを使用している場合です。 スレッドはこの状態を共有し、両方ともこのメモリにアクセスでき、それを読んだり書き直したりすることができます。 しかし、スレッドモデルの上にアクターモデルを構築することができますし、実際、すべてのアクター実装はその下にスレッドを持ちます。 私は、面白半分に、各スレッドにミューテックスで保護されたキューを与えることで、このようなものを(非常にひどく)ハックしたことがあります。 アクターとスレッドのインピーダンスがどのように管理されているかを知るには、以下を参照してください。 1年前の私の質問 .

スレッドを使い分けることで、どの言語でもアクターモデルを利用できるのでしょうか?

はい、しかしそれにはもう少し作業が必要です。 あなたの好きな言語にはメッセージパッシングライブラリがあるかもしれませんので、まずそれを調査することになるでしょう。 また、イミュータブルなデータ構造の使用も調査する必要があります。 データ構造がイミュータブルであれば、本質的に共有状態の問題に対処できることに注意してください。 アクター言語が関数型言語(erlangやscala)になりがちなのには理由があるのです。

また、Software Transactional Memoryも見てみたいかもしれません。これは違うけど、説得力のあるモデルです。 Clojureは私のお気に入りの例です。