我在Windows上使用C ++中的Apache thrift,我想请求您帮助取消正在进行的阻塞读取操作。读取操作(例如 - TProtocol :: readByte)将被阻止,直到收到数据。当我从另一个线程关闭传输时,我得到一个关于空指针的失败断言。
还有其他方法可以取消阻止的读取操作吗?
答案 0 :(得分:5)
假设您在Windows上运行(根据您问题上的标记):您可以使用WSACancelBlockingCall
取消阻塞套接字操作(尽管此操作已弃用,但它仍然有效)。然后,您的套接字将返回错误代码WSAEINTR
(Interrupted function call),而不是WSAETIMEDOUT
。
在Thrift中,您可以使用TSocket::getSocketFD()或TPipe::getPipeHandle()获取取消当前操作的相应句柄。
答案 1 :(得分:3)
如果您正在使用阻塞模式,那么中止读取操作的唯一选项是在读取之前在TSocket上设置超时。