函数 ibv_get_cq_event() 阻塞并且即使在销毁所有资源后也永远不会返回。
我初始化所有 InfiniBand 资源,在单独的线程中启动 ibv_get_cq_event,然后销毁所有 InfiniBand 资源,但 ibv_get_cq_event 永远不会返回。
什么是正确的初始化和销毁 IB (RDMA)?
函数 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()
保存对文件的引用,内核不会read()
仅仅因为其他人调用close()
.
至少有两种合理的方法可以处理您的情况:
在尝试清理 IB 资源之前,向被阻塞的线程发送信号以read()
唤醒它。
用于fcntl
设置O_NONBLOCK
,comp_channel->fd
然后使用事件循环,poll()
或epoll
知道完成通道何时可读。仅read()
在事件存在时调用,并在拆除 RDMA 资源时停止事件循环。