Multithreading AIO可以在不创建线程的情况下运行吗?
我希望aio在读取操作完成时向我的程序发送信号,并且根据,这样的通知可以通过内核发送的信号或启动运行用户函数的线程来接收。通过设置正确的Multithreading AIO可以在不创建线程的情况下运行吗?,multithreading,signals,aio,Multithreading,Signals,Aio,我希望aio在读取操作完成时向我的程序发送信号,并且根据,这样的通知可以通过内核发送的信号或启动运行用户函数的线程来接收。通过设置正确的sigev\u notify值,可以选择任一行为 我尝试了一下,很快发现即使设置为通过信号接收通知,也会创建另一个线程 (gdb) info threads Id Target Id Frame 2 Thread 0x7ffff7ff9700 (LWP 6347) "xnotify" 0x00007ffff7147e50 in
sigev\u 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
是否可以在根本不使用任何(userland)线程的情况下运行aio(当然,除了主线程之外)
编辑:
我更深入地研究了它。librt似乎提供了一组aio函数:通过glibc源代码查看,发现了一些可疑之处:inside/rt/aio_read.c是一个函数存根:
int aio_read (struct aiocb *aiocbp)
{
__set_errno (ENOSYS);
return -1;
}
stub_warning (aio_read)
我在子目录sysdeps/pthread中找到了第一个相关的实现,它直接调用\uu aio\u enqueue\u request(…,LIO\u READ)
,然后创建pthread。但是当我想知道为什么在这种情况下会出现stup时,我认为stub可能由linux内核本身实现,pthread实现可能是某种回退代码
通过我的/usr/src/linux目录浏览
aio\u read
会得到很多结果,我现在正试图理解这些结果。我发现实际上有两个真正不同的aio
库:一个是glibc的一部分,包含在librt中,并使用pthreads执行异步访问。另一个aio库实现了与第一个相同的接口,但它构建在linux内核本身之上,可以使用信号异步运行