是否可以强制线程从对阻塞函数的调用返回,例如从流中阻塞读取?
int x;
std::cin >> x;
例如...
不,这是不可能的。如果你想知道是否有数据要读取,使用 select() 系统调用 - 如果你只在有数据等待时读取,你永远不会阻塞
也许试试这个istream::readsome()
方法。它不等待设备,只读取缓冲流的缓冲区中的内容。
您可以查看istream 对象。
另一种方法是让一个单独的线程永久等待控制台输入并将数据放入队列或缓冲区中。然后,缓冲区的接口由您决定,您可以将其设为阻塞、非阻塞或超时(或全部三个)。
既然有人说这是不可能的,我认为提供一些替代方案应该很好。
我通常会做一些服务器代码,我们对数据库的同步调用(阻塞)也有同样的问题。有时(无论出于何种原因)呼叫可能无法足够快地返回,并且您的处理时间有限。
我们采用的解决方案非常简单,当然也涉及到机器翻译:
作为一种习惯,我们将计时器设置为一个舒适的区域,介于允许处理请求的最大时间的 75% 到 95% 之间(按请求类别配置)。
这使您可以巧妙地避免阻塞调用。如果您不想正确同步您的 BOM(因为它涉及开销),“尽力而为”的答案很可能是一个简单的重试消息(即 95%)。如果您有清理工作或其他方式(缓存?)来回答,您至少需要在部分 BOM 中进行同步(即 75%)。