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