Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 取消Thrift中的阻塞读取操作_C++_Windows_Thrift - Fatal编程技术网

C++ 取消Thrift中的阻塞读取操作

C++ 取消Thrift中的阻塞读取操作,c++,windows,thrift,C++,Windows,Thrift,我在Windows上使用C++中的Apache节省,我想请求您帮助取消正在进行的阻塞读操作。读取操作(例如–TProtocol::readByte)将被阻止,直到收到数据。当我从另一个线程关闭传输时,我得到一个关于空指针的失败断言 是否有其他方法可以取消阻止的读取操作?如果您使用的是阻止模式,那么中止读取操作的唯一选项是在读取之前在TSocket上设置一个超时。假设您在Windows上运行(根据您问题上的标记):您可以使用(尽管此操作已被弃用,但仍应有效)。然后,套接字将返回错误代码,而不是WS

我在Windows上使用C++中的Apache节省,我想请求您帮助取消正在进行的阻塞读操作。读取操作(例如–TProtocol::readByte)将被阻止,直到收到数据。当我从另一个线程关闭传输时,我得到一个关于空指针的失败断言


是否有其他方法可以取消阻止的读取操作?

如果您使用的是阻止模式,那么中止读取操作的唯一选项是在读取之前在TSocket上设置一个超时。

假设您在Windows上运行(根据您问题上的标记):您可以使用(尽管此操作已被弃用,但仍应有效)。然后,套接字将返回错误代码,而不是
WSAETIMEDOUT


在Thrift中,您可以使用或获取相应的句柄来取消当前操作。

在这种情况下,任何TProtocol实现都无法区分“服务器尚未发送数据”和“用户希望取消操作”。由于我们不通过快速连接进行操作,因此我们确实需要区分这两种情况。为什么您关心TProtocol?在RPC调用后,这两种情况都会引发TimeoutException抛出,您可以决定下一步要做什么。因为在服务er的响应尚未到达。如果我的超时时间太长,取消响应对于我们的客户端来说将太慢。由于我们在低带宽和高延迟环境中运行,我们无法承受短超时,因为它们几乎总是会发生。但是,我们仍然希望取消。一种肮脏的方法是用可接受的时间将此RPC包装成一个循环ut值,检查标志以查看用户是否取消操作。否则,您将不得不切换到非阻塞方式。不幸的是,WSACancelBlockingCall已从Winsock2中删除。Thrift使用Winsock2()。但这是一个好主意。您可以使用该函数,它仍然存在于Winsock2中(尽管它不是由DLL导出的)。如果您不想使用这种攻击,也可以从另一个线程关闭套接字。阻止操作将导致错误WSA_操作_中止(适用于Winsock2操作,但不适用于Winsock1操作)。