C++ 取消Thrift中的阻塞读取操作
我在Windows上使用C++中的Apache节省,我想请求您帮助取消正在进行的阻塞读操作。读取操作(例如–TProtocol::readByte)将被阻止,直到收到数据。当我从另一个线程关闭传输时,我得到一个关于空指针的失败断言C++ 取消Thrift中的阻塞读取操作,c++,windows,thrift,C++,Windows,Thrift,我在Windows上使用C++中的Apache节省,我想请求您帮助取消正在进行的阻塞读操作。读取操作(例如–TProtocol::readByte)将被阻止,直到收到数据。当我从另一个线程关闭传输时,我得到一个关于空指针的失败断言 是否有其他方法可以取消阻止的读取操作?如果您使用的是阻止模式,那么中止读取操作的唯一选项是在读取之前在TSocket上设置一个超时。假设您在Windows上运行(根据您问题上的标记):您可以使用(尽管此操作已被弃用,但仍应有效)。然后,套接字将返回错误代码,而不是WS
是否有其他方法可以取消阻止的读取操作?如果您使用的是阻止模式,那么中止读取操作的唯一选项是在读取之前在TSocket上设置一个超时。假设您在Windows上运行(根据您问题上的标记):您可以使用(尽管此操作已被弃用,但仍应有效)。然后,套接字将返回错误代码,而不是
WSAETIMEDOUT
在Thrift中,您可以使用或获取相应的句柄来取消当前操作。在这种情况下,任何TProtocol实现都无法区分“服务器尚未发送数据”和“用户希望取消操作”。由于我们不通过快速连接进行操作,因此我们确实需要区分这两种情况。为什么您关心TProtocol?在RPC调用后,这两种情况都会引发TimeoutException抛出,您可以决定下一步要做什么。因为在服务er的响应尚未到达。如果我的超时时间太长,取消响应对于我们的客户端来说将太慢。由于我们在低带宽和高延迟环境中运行,我们无法承受短超时,因为它们几乎总是会发生。但是,我们仍然希望取消。一种肮脏的方法是用可接受的时间将此RPC包装成一个循环ut值,检查标志以查看用户是否取消操作。否则,您将不得不切换到非阻塞方式。不幸的是,WSACancelBlockingCall已从Winsock2中删除。Thrift使用Winsock2()。但这是一个好主意。您可以使用该函数,它仍然存在于Winsock2中(尽管它不是由DLL导出的)。如果您不想使用这种攻击,也可以从另一个线程关闭套接字。阻止操作将导致错误WSA_操作_中止(适用于Winsock2操作,但不适用于Winsock1操作)。