gpt4 book ai didi

linux - POSIX AIO 库和回调处理程序

转载 作者:IT王子 更新时间:2023-10-29 00:57:18 25 4
gpt4 key购买 nike

根据关于 aio_read/write 的文档,AIO 库基本上可以通过两种方式通知您的应用程序异步文件 I/O 操作已完成。要么 1) 您可以使用信号,2) 您可以使用回调函数

我认为回调函数比信号更可取,并且可能更容易集成到更高级别的多线程库中。不幸的是,这个功能的文档至少可以说是一团糟。一些来源,例如 man page for the sigevent struct ,表示需要将sigevent结构中的sigev_notify数据成员设置为SIGEV_CALLBACK,然后提供一个函数handler。据推测,处理程序是在同一个线程中调用的。其他 documentation表示您需要将 sigev_notify 设置为 SIGEV_THREAD,这将在新创建的线程中调用回调处理程序。

无论如何,在我的 Linux 系统(具有 2.6.28 内核的 Ubuntu)上,SIGEV_CALLBACK 似乎没有在任何地方定义,但 SIGEV_THREAD 像宣传的那样工作。不幸的是,创建一个新线程来调用回调处理程序似乎效率很低,尤其是当您需要调用许多处理程序时。最好使用现有的线程池,类似于大多数网络 I/O 事件多路分解器的工作方式。某些版本的 UNIX,例如 QNX,包含一个 SIGEV_SIGNAL_THREAD 标志,它允许您使用指定的现有线程调用处理程序,但这在 Linux 上似乎不可用,甚至似乎也不是 POSIX 的一部分标准。

那么,是否可以通过在预分配的后台线程/线程池中调用用户处理程序的方式来使用 POSIX AIO 库,而不是在每次调用处理程序时都创建/销毁新线程?

最佳答案

我通常发现通过在一个或多个专用后台线程中执行普通 IO,以我喜欢的方式分派(dispatch)完成回调来模拟异步 IO 更简单、更便携。

关于linux - POSIX AIO 库和回调处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1219897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com