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()

状況を処理するには、少なくとも 2 つの合理的な方法があります。

  • IB リソースのクリーンアップを試行する前に、ブロックされているスレッドにシグナルを送信して、スレッドread()をウェイクアップします。

  • オンfcntlに設定してから、イベント ループを使用するか、完了チャネルが読み取り可能になったときに使用します。イベントが発生したときにのみ呼び出し、RDMA リソースを破棄するときにイベント ループを停止します。O_NONBLOCKcomp_channel->fdpoll()epollread()

于 2013-03-16T09:06:13.833 に答える