gpt4 book ai didi

linux - 函数 ibv_get_cq_event() 在销毁后不返回

转载 作者:太空宇宙 更新时间:2023-11-04 11:24:48 28 4
gpt4 key购买 nike

函数 ibv_get_cq_event() 即使在销毁所有资源后也不会返回。

我会初始化所有 InfiniBand 资源,在单独的线程中启动 ibv_get_cq_event,然后销毁所有 InfiniBand 资源,但 ibv_get_cq_event 永远不会返回。

什么是正确的初始化和销毁​​ IB (RDMA)?

最佳答案

ibv_get_cq_event() 中阻塞,然后尝试销毁您的资源大致相当于创建套接字,在 read() 中阻塞,然后调用 close () 在不同线程的套接字上。事实上,在内部,完成 channel 实际上只是一个文件描述符,而 ibv_get_cq_event() 几乎只是 read() 的包装器。在这两种情况下,read() 持有文件的引用并且内核不会唤醒 read() 只是因为其他人调用了 close( )

至少有两种合理的方法来处理您的情况:

  • 在尝试清理 IB 资源之前,向阻塞在 read() 中的线程发送信号以将其唤醒。

  • 使用fcntlcomp_channel->fd 上设置O_NONBLOCK,然后使用带有poll() 的事件循环epoll 知道完成 channel 何时可读。仅在存在事件时调用 read(),并在拆除 RDMA 资源时停止事件循环。

关于linux - 函数 ibv_get_cq_event() 在销毁后不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15427289/

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