Linux 函数ibv_get_cq_event()在析构函数后不返回
函数ibv_get_cq_event()阻塞,即使在销毁所有资源后也不会返回 我初始化所有InfiniBand资源,在单独的线程中启动ibv_get_cq_事件,然后销毁所有InfiniBand资源,但ibv_get_cq_事件永远不会返回Linux 函数ibv_get_cq_event()在析构函数后不返回,linux,infiniband,rdma,Linux,Infiniband,Rdma,函数ibv_get_cq_event()阻塞,即使在销毁所有资源后也不会返回 我初始化所有InfiniBand资源,在单独的线程中启动ibv_get_cq_事件,然后销毁所有InfiniBand资源,但ibv_get_cq_事件永远不会返回 什么是正确的初始化和销毁IB(RDMA)?在ibv\u get\u cq\u event()中阻塞,然后尝试销毁资源大致相当于创建一个套接字,在read()中阻塞,然后在另一个线程中对套接字调用close()。实际上,在内部,完成通道实际上只是一个文件描述符
什么是正确的初始化和销毁IB(RDMA)?在
ibv\u get\u cq\u event()
中阻塞,然后尝试销毁资源大致相当于创建一个套接字,在read()
中阻塞,然后在另一个线程中对套接字调用close()
。实际上,在内部,完成通道实际上只是一个文件描述符,ibv\u get\u cq\u event()
几乎只是read()
的包装器。在这两种情况下,read()
保存文件的引用,内核不会因为其他人调用了close()
而唤醒read()
至少有两种合理的方法来处理您的情况:
- 在尝试清理IB资源之前,向
中阻塞的线程发送一个信号以唤醒它read()
- 使用
在fcntl
上设置comp\u channel->fd
,然后在完成通道可读时使用带有O\u NONBLOCK
poll()或
的事件循环。只有在存在事件时才调用epoll
,并在拆除RDMA资源时停止事件循环read()