読み取り操作が完了したときに aio がプログラムに通知するようにしたいと思います。このページによると、そのような通知は、カーネルから送信されたシグナル、またはユーザー関数を実行するスレッドの開始によって受信できます。の正しい値を設定することで、どちらの動作も選択できますsigev_notify
。
試してみると、シグナルで通知を受け取るように設定しても、別のスレッドが作成されていることがすぐにわかりました。
(gdb) info threads
Id Target Id Frame
2 Thread 0x7ffff7ff9700 (LWP 6347) "xnotify" 0x00007ffff7147e50 in gettimeofday () from /lib64/libc.so.6
* 1 Thread 0x7ffff7fc3720 (LWP 6344) "xnotify" 0x0000000000401834 in update (this=0x7fffffffdc00)
ドキュメントには、次のようにも記載されています。これらの関数の実装は、カーネルのサポート (利用可能な場合) を使用するか、ユーザーレベルのスレッドに基づく実装を使用して行うことができます。スレッドをまったく使用したくないのですが、これは可能ですか?
カーネルをチェックしたところ、問題ないようです。
qdii@localhost /home/qdii $ grep -i aio /usr/src/linux/.config
CONFIG_AIO=y
(もちろん、メインスレッドは別として)(ユーザーランド)スレッドなしでaioを実行することは可能ですか?
編集:私はそれをより深く掘り下げました。librt は aio 関数のコレクションを提供しているようです: glibc のソースを調べると、怪しいものが露出しました: 内部 /rt/aio_read.c は関数スタブです:
int aio_read (struct aiocb *aiocbp)
{
__set_errno (ENOSYS);
return -1;
}
stub_warning (aio_read)
サブディレクトリ sysdeps/pthread で最初の関連する実装を見つけました__aio_enqueue_request(..., LIO_READ)
。これは を直接呼び出し、次に pthread を作成しました。しかし、なぜその場合にスタックが発生するのか疑問に思っていたので、おそらくスタブは Linux カーネル自体によって実装される可能性があり、その pthread 実装はある種のフォールバック コードになるのではないかと考えました。
/usr/src/linux ディレクトリをgrep するとaio_read
、多くの結果が得られます。これについては、現在理解しようとしています。