ぬうぱんの備忘録

技術系のメモとかいろいろ

作った曲一覧はこちら

boost.asioで同期受信のブロッキング解除

なにがあった

 TPCでもUDPでも同期受信関数を呼び出すともれなくブロッキングされるのだが、プログラム終了時に安全にブロッキングを解除する方法が無いっぽいことをメモ。

状況

 まず、同期受信関数は子スレッドで動作しているものとする。
親スレッドは受信スレッドを立ち上げた後、メッセージループなんかでプログラムの終了コードを待っている状態。
 この場合、親スレッドでソケットをクローズしてもブロッキングは解除されない。cancel()関数は非同期の話。
 なので、結局は子スレッドのjoinを待たずに無理やり殺すしか方法は無いみたいです。

それ以前に

 素直に非同期IO使えって話ですね。はい。

一応

 受信前にavailable()関数でデータ来ているかチェックしておけば、一応ブロッキングを回避出来るみたいです。