関数 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_NONBLOCKcomp_channel->fdpoll()epollread()