関数 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()
状況を処理するには、少なくとも 2 つの合理的な方法があります。
IB リソースのクリーンアップを試行する前に、ブロックされているスレッドにシグナルを送信して、スレッドread()
をウェイクアップします。
オンfcntl
に設定してから、イベント ループを使用するか、完了チャネルが読み取り可能になったときに使用します。イベントが発生したときにのみ呼び出し、RDMA リソースを破棄するときにイベント ループを停止します。O_NONBLOCK
comp_channel->fd
poll()
epoll
read()