Windows の C++ で Apache thrift を使用しています。進行中のブロック読み取り操作をキャンセルする方法を教えてください。読み取り操作 (例: TProtocol::readByte) は、データが受信されるまでブロックされます。別のスレッドからトランスポートを閉じると、null ポインターに関する失敗したアサーションが発生します。
ブロックされた読み取り操作をキャンセルする他の方法はありますか?
Windowsで実行していると仮定すると(質問のタグによると):ブロッキングソケット操作をキャンセルできますWSACancelBlockingCall
(この操作は非推奨ですが、引き続き機能するはずです)。ソケットは、代わりにエラー コード(WSAEINTR
中断された関数呼び出し)WSAETIMEDOUT
を返します。
Thrift では、TSocket::getSocketFD()またはTPipe::getPipeHandle()を使用して、現在の操作をキャンセルするための適切なハンドルを取得できます。
ブロッキング モードを使用している場合、読み取り操作を中止する唯一のオプションは、読み取り前に TSocket にタイムアウトを設定することです。