函數ibv_get_cq_event()塊並且在銷燬所有資源後永遠不會返回。功能ibv_get_cq_event()在破壞後不返回
我會初始化所有InfiniBand資源,在單獨的線程中啓動ibv_get_cq_event,然後銷燬所有InfiniBand資源,但ibv_get_cq_event永不返回。
什麼是正確的初始化和破壞IB(RDMA)?
函數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資源時停止事件循環。