9

Windows の C++ で Apache thrift を使用しています。進行中のブロック読み取り操作をキャンセルする方法を教えてください。読み取り操作 (例: TProtocol::readByte) は、データが受信されるまでブロックされます。別のスレッドからトランスポートを閉じると、null ポインターに関する失敗したアサーションが発生します。

ブロックされた読み取り操作をキャンセルする他の方法はありますか?

4

2 に答える 2

5

Windowsで実行していると仮定すると(質問のタグによると):ブロッキングソケット操作をキャンセルできますWSACancelBlockingCall(この操作は非推奨ですが、引き続き機能するはずです)。ソケットは、代わりにエラー コード(WSAEINTR中断された関数呼び出し)WSAETIMEDOUTを返します。

Thrift では、TSocket::getSocketFD()またはTPipe::getPipeHandle()を使用して、現在の操作をキャンセルするための適切なハンドルを取得できます。

于 2013-09-03T08:40:23.813 に答える
3

ブロッキング モードを使用している場合、読み取り操作を中止する唯一のオプションは、読み取り前に TSocket にタイムアウトを設定することです。

于 2013-08-29T08:58:29.913 に答える