gpt4 book ai didi

linux - 正确处理 libaio 回调中的上下文数据?

转载 作者:太空狗 更新时间:2023-10-29 11:05:29 24 4
gpt4 key购买 nike

我正在使用内核级异步 I/O(即 libaio.h)。在提交 struct iocb 之前使用 io_submit我使用 io_set_callback 设置回调在 iocb->data 中粘贴一个函数指针.最后,我使用 io_getevents 获得完成的事件并运行每个回调。

我希望能够在回调中使用一些上下文信息(例如提交时间戳)。我能想到的唯一方法是继续使用 io_getevents , 但有 iocb->data指向具有上下文和回调的结构。

有没有其他方法可以做这样的事情,并且是iocb->data使用 io_getevents 时保证不受影响?我的理解是还有另一种方法 libaio如果 iocb->data 将自动运行回调,这将是一个问题没有指向一个函数。

这里的任何澄清都会很好。关于 libaio 的文档好像真的很缺。

最佳答案

一种解决方案,我认为是典型的,是从 iocb“派生”,然后将从 io_getevents() 返回的指针转换为您的结构。像这样:

struct my_iocb {
iocb cb;
void* userdata;
// ... anything else
};

当您发布作业时,无论是一次一个还是批量执行,您都会向 iocb 结构提供一组指针,这意味着它们可能也指向 my_iocb

当您从 io_getevents() 检索回通知时,您只需将 io_event::obj 指针转换为您自己的类型:

io_event events[512];
int num_events = io_getevents(ioctx, 1, 512, events, NULL);
for (int i = 0; i < num_events; ++i) {
my_iocb* job = (my_iocb*)events[i].obj;
// .. do stuff with job
}

如果您不想在 io_getevents 中阻塞,而是通过文件描述符得到通知(这样您就可以在 select() 中阻塞epoll(),这可能更方便),我建议使用(未记录的)eventfd 集成。

您可以使用 io_set_eventfd(iocb* cb, int fd)aiocb 绑定(bind)到 eventfd 文件描述符。每当作业完成时,它都会将 eventfd 递增 1。

请注意,如果您使用此机制,那么从 io 上下文(使用 io_getevents())读取的作业永远不要超过 eventfd 计数器所说的,这一点非常重要,否则您会引入一个当您读取 eventfd 计数器并获得作业时的竞争条件。

关于linux - 正确处理 libaio 回调中的上下文数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9825258/

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