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