2012-02-25 56 views
2

我希望aio在读取操作完成时向我的程序发送信号,并且根据this page,可以通过内核发送的信号或通过启动运行用户函数的线程来接收此类通知。通过设置正确的值sigev_notify可以选择任何行为。AIO可以不创建线程而运行吗?

我试了一下,很快发现,即使设置为通过信号接收通知,也创建了另一个线程。

(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) 

该文档还指出:这些功能的实现可以在内核中使用的支持(如果有的话),或使用基于用户级在线程的实现来完成。 我想没有线程,这是可能的吗?

我查了我的内核,那看起来不错:

[email protected] /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第一相关实施/并行线程,它直接调用__aio_enqueue_request(..., LIO_READ),这反过来又创建了pthread。但是当我想知道为什么会出现这种情况时,我想可能这个存根可能是由linux内核本身实现的,而pthread实现可能是某种后备代码。

通过我的/ usr/src/linux目录下载aio_read给出了很多结果,我现在正在尝试理解。

回答

1

我发现,实际上有两种不同的真库aio:一个是的glibc的一部分,包含在librt,并通过使用并行线程异步访问。另一个aio库实现与第一个接口相同的接口,但它建立在Linux内核本身之上,可以使用信号异步运行。

相关问题