0

私は Erlang のスレッド アーキテクチャ (小さくて安価なスレッドと「何も共有しない」アーキテクチャ) が大好きですが、Erlang は私のアプリケーションには完全には適していないようです (これらは C/C++ でよりパフォーマンスが向上しますが、Erlang はそうではありません)。その点で最高)。

すでに述べたように、私は (OS スレッドを使用していない) Erlang のスレッド アーキテクチャが本当に好きです。それで、私の質問は - C/C++ コードで使用するためにこのアーキテクチャを実装する同様のライブラリはありますか? 私がグーグルで調べた限りでは、Java の「グリーン スレッド」(ずっと前に廃止され、現在のバージョンから削除された) と D の「ファイバー」(1 つの「実際の」スレッドに制限されているが、Erlang はスレッドは、Erlang によって最も適切な「実際の」スレッドで実行されます)。これは多少似ていますが、Erlang スレッドほど強力ではありません。

そのようなライブラリがない場合は、必要なコードのチャンクを C/C++ で記述するためにerl_nifインターフェイスを使用することを検討しています。しかし、パフォーマンス分析をどこにも見つけることができませんでした - erl_nif は高速ですか、それとも Erlang 用語/データ型を C/C++ 型に「変換」するオーバーヘッドは本当に大きいですか?

ありがとう!

4

3 に答える 3

2

あなたが求めているのは「アクターモデル」と呼ばれるものです

それを実装するかなりの数のC++ライブラリがあります

  1. libcppa
  2. アクター-CPP
  3. セロン

どちらが優れているかは、特定のユースケースに完全に依存します。

ただし、erlang のプロセスとは対照的に、安価なスレッドとプリエンプティブなタスク切り替えの両方を実行できるプロセスはないことに注意してください。アクターをワーカー OS スレッドに 1 対 1 でマッピングしてプリエンプティブ スイッチングを行うか、イベント ベースのアクターと協調マルチタスクを使用します。

于 2012-11-20T10:10:18.447 に答える
2

Akkaは Erlang スタイルのアクターを提供しますが、C/C++ ではなく Java/Scala 向けです。

私が読んだこと (例: http://www.scribd.com/doc/87376094/Erlang-and-OTP-in-Action#outer_page_324 ) によると、NIF は高速ですが、Erlang プログラム全体をクラッシュさせる可能性があるという点で潜在的に危険です。 . Erlang ポート (http://www.erlang.org/doc/reference_manual/ports.html) を使用して C/C++ と通信することを試すことができます。これは、ポートが Erlang 以外のコードを Erlang 監視ツリーから分離しているため、より安全です。 .

于 2012-11-20T10:08:25.030 に答える
1

erl_nif OSスレッドを使用します:

VM の応答性が低下する可能性があるため、NIF 呼び出しで長時間の作業を行うことは避けてください。NIF は、呼び出し元の Erlang コードを実行した同じスケジューラ スレッドによって直接呼び出されます。したがって、呼び出し元のスケジューラは、NIF が戻るまで、他の作業を行うことがブロックされます。

したがって、Akka が最適な選択肢のように思えます。

于 2012-11-20T12:14:45.360 に答える