aio_read/write に関するドキュメントによると、AIO ライブラリが非同期ファイル I/O 操作が完了したことをアプリケーションに通知する方法は基本的に 2 つあります。1) シグナルを使用できる、2) コールバック関数を使用できる
コールバック関数はシグナルよりもはるかに優れており、おそらく高レベルのマルチスレッド ライブラリに統合する方がはるかに簡単だと思います。残念ながら、この機能のドキュメントは控えめに言ってもめちゃくちゃです。sigevent 構造体のマニュアル ページなどの一部の情報源は、sigevent 構造体の sigev_notify データ メンバーを SIGEV_CALLBACK に設定してから、関数ハンドラーを提供する必要があることを示しています。おそらく、ハンドラーは同じスレッドで呼び出されます。他のドキュメントでは、sigev_notify を SIGEV_THREAD に設定する必要があることが示されています。これにより、新しく作成されたスレッドでコールバック ハンドラが呼び出されます。
いずれにせよ、私の Linux システム (カーネル 2.6.28 の Ubuntu) では、SIGEV_CALLBACK はどこにも定義されていないようですが、SIGEV_THREAD は宣伝どおりに機能します。残念ながら、コールバック ハンドラーを呼び出すために新しいスレッドを作成するのは、特に多くのハンドラーを呼び出す必要がある場合、非常に効率が悪いようです。ほとんどのネットワーク I/O イベント デマルチプレクサが動作する方法と同様に、既存のスレッド プールを使用することをお勧めします。QNX などの UNIX の一部のバージョンには SIGEV_SIGNAL_THREAD フラグが含まれており、指定された既存のスレッドを使用してハンドラーを呼び出すことができますが、これは Linux では使用できないようであり、POSIX の一部でさえないようです。標準。
それで、ハンドラーが呼び出されるたびに新しいスレッドを作成/破棄するのではなく、事前に割り当てられたバックグラウンドスレッド/スレッドプールでユーザーハンドラーを呼び出す方法で POSIX AIO ライブラリを使用することは可能ですか?