我在Windows上使用C ++的Apache thrift,我想请求帮助取消正在进行的阻止读取操作。 读操作(例如 – TProtocol :: readByte)被阻塞,直到收到数据。 当我从另一个线程closures传输时,我得到一个空指针失败的断言。
有没有其他方法可以取消被阻塞的读取操作?
假设你在Windows上运行(根据你问题的标签):你可以用WSACancelBlockingCall
取消阻塞套接字操作(尽管这个操作已经被弃用了,它仍然可以工作)。 然后,您的套接字将返回错误代码WSAEINTR
(中断的函数调用),而不是WSAETIMEDOUT
。
在Thrift中,可以使用TSocket :: getSocketFD()或TPipe :: getPipeHandle()来获取取消当前操作的相应句柄。
如果你使用的是阻塞模式,那么在读取操作之前,中止读取操作的唯一选择是在TSocket上设置超时。