Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 函数ibv_get_cq_event()在析构函数后不返回_Linux_Infiniband_Rdma - Fatal编程技术网

Linux 函数ibv_get_cq_event()在析构函数后不返回

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()。实际上,在内部,完成通道实际上只是一个文件描述符

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

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


什么是正确的初始化和销毁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
    的事件循环。只有在存在事件时才调用
    read()
    ,并在拆除RDMA资源时停止事件循环