0

函数 ibv_get_cq_event() 阻塞并且即使在销毁所有资源后也永远不会返回。

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

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

4

1 回答 1

1

阻塞ibv_get_cq_event()然后试图破坏你的资源大致相当于创建一个套接字,阻塞read()然后close()在不同的线程中调用套接字。实际上,在内部,完成通道实际上只是一个文件描述符,并且ibv_get_cq_event()几乎只是read(). 在这两种情况下,read()保存对文件的引用,内核不会read()仅仅因为其他人调用close().

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

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

  • 用于fcntl设置O_NONBLOCKcomp_channel->fd然后使用事件循环,poll()epoll知道完成通道何时可读。仅read()在事件存在时调用,并在拆除 RDMA 资源时停止事件循环。

于 2013-03-16T09:06:13.833 回答