功能ibv_get_cq_event()在破坏后不返回
问题描述:
函数ibv_get_cq_event()块并且在销毁所有资源后永远不会返回。功能ibv_get_cq_event()在破坏后不返回
我会初始化所有InfiniBand资源,在单独的线程中启动ibv_get_cq_event,然后销毁所有InfiniBand资源,但ibv_get_cq_event永不返回。
什么是正确的初始化和破坏IB(RDMA)?
答
阻止在ibv_get_cq_event()
,然后试图摧毁你的资源大致相当于创建一个套接字,在read()
阻塞,然后在另一个线程上的套接字上调用close()
。实际上,内部完成通道实际上只是一个文件描述符,并且ibv_get_cq_event()
几乎只是read()
的一个包装。在这两种情况下,read()
在文件上都有一个引用,并且内核不会因为其他人调用close()
而唤醒read()
。
有至少两个合理的方式来处理您的情况:
之前试图清理IB资源,发送信号给挡在
read()
线程将其唤醒。已知使用
fcntl
上设置comp_channel->fd
O_NONBLOCK
,然后使用一个事件循环与poll()
或epoll
当完成通道是可读的。当有事件发生时,请仅调用read()
,并在拆除RDMA资源时停止事件循环。