2

非同期 API 呼び出し / ノンブロッキング呼び出しを実装しようとするとき、私が持っている All Plain-C アプリケーションで少し知っていることは、「デリゲート」による APM (非同期プログラミング モデル) について読んだことです。基本的に私がやりたいことf1()は、機能を実行するために 1 つの API を呼び出すことです (これには 8 ~ 10 秒かかります)。そのため、その API を呼び出し、それをf1()忘れて、データをフェッチするための I/O など、他の作業を続けます。f1()または の結果に依存しない機能の次の呼び出し用f1()

その APM モデルのプログラミングを使用したことがある人がいれば、非ブロッキング呼び出しの実装に関する簡潔な説明を探しています。

非同期 API を実装する他の方法、これに役立つ他のライブラリ/フレームワークはありますか?

4

5 に答える 5

1

単純な C プログラムで非同期プログラミングを行う一般的な方法は、「イベント ループ」を使用することです。使用できるライブラリは多数あります。glibをご覧になることをお勧めします 。

もう 1 つの方法は、複数のプリエンプティブ スレッド (同時操作ごとに 1 つ) を使用し、それらをミューテックスおよび条件変数と同期させることです。ただし、特に移植可能なプログラムを作成する場合は、プレーン C でのプリエンプティブ スレッド化は避けたいと思います。どのライブラリ関数が再入可能であるかを知るのは難しく、スレッド化されたプログラムでのシグナル処理は面倒であり、一般に C ライブラリとシステム関数はシングルスレッドで使用するように設計されています。

アプリケーションを 1 つのプラットフォーム (Windows など) でのみ実行する予定で、f1() で行う作業が比較的単純なものであれば、スレッド化で問題ありません。

于 2008-09-15T14:08:33.687 に答える
1

基本的に、マルチスレッド (またはマルチプロセス) アプリケーションを作成する必要があります。f1() API は、別の実行スペースでデータを処理するためにスレッド (またはプロセス) を生成する必要があります。完了すると、f1() ルーチンはメイン プロセスに実行が完了したことを通知する必要があります (signal()、メッセージ キューなど)。

于 2008-09-15T13:25:28.953 に答える
1

参照している関数 f1() 自体が非同期方式で実装されていない場合は、自分で独自のスレッドにラップする必要があります。これを行うときは、その特定の関数が呼び出されることによって引き起こされる可能性のある副作用に関して注意する必要があります。多くのライブラリはスレッドセーフな方法で設計されておらず、そのようなライブラリから複数の関数を同時に呼び出すと、データが破損する可能性があります。このような場合、外部ワーカー プロセスで機能をラップする必要がある場合があります。あなたが言及した(8〜10秒)重労働の場合、オーバーヘッドは許容できる場合があります。外部の非スレッドセーフ関数を一度に 1 つのスレッドでのみ使用する場合は、安全かもしれません。

どの形式のイベント ループを使用する場合の問題も、ループを認識しない外部関数がループに制御を返さないことです。したがって、他に何もすることができなくなります。

于 2008-09-30T11:47:56.843 に答える
0

良い。基本的に、2 種類の非同期 API を見てきました。

  1. 割り込み。呼び出しの後に実行する必要があるコールバックを呼び出しに与えます。GIO (前述の GLib の一部) はこのように機能します。プログラミングは比較的簡単ですが、通常はコールバックが実行されるスレッドが変更されます (GIO の場合のようにメイン ループと統合されている場合を除く)。
  2. 世論調査。データが利用可能かどうかを確認します。よく知られている BSD ソケットは、このような方法で動作します。必ずしもメイン ループと統合されず、特定のスレッドでコールバックが実行されるという利点があります。

Gnome または Gtk+ ベースのプログラムを作成している場合は、 GTaskが非常に優れているように思われることを付け加えたいと思います (潜在的に優れている? 私は使用していません)。Valaは、GIO のような非同期呼び出しをより適切にサポートします。

于 2009-04-19T09:24:51.037 に答える
0

デリゲートを C の関数へのポインターに置き換えます。他のすべては、基本的に読んだものと同じです。

于 2008-09-15T12:33:36.100 に答える