如何从被阻止的电话中返回?

时间:2010-01-15 17:04:05

标签: c++ multithreading blocking

是否可以强制线程从调用返回到阻塞函数,例如阻止从流中读取?

int x;
std::cin >> x;

例如......

4 个答案:

答案 0 :(得分:5)

不,这是不可能的。如果你想知道是否有要读取的数据,请使用select()系统调用 - 如果只在数据等待时读取,则永远不会阻止

答案 1 :(得分:0)

也许尝试使用istream::readsome()方法。它不等待设备,只读取缓冲流缓冲区中的内容。

答案 2 :(得分:0)

你可以peek一个istream对象。

另一种方法是让一个单独的线程永久等待控制台输入并将数据放入队列或缓冲区。然后,缓冲区的接口由您决定,您可以将其设置为阻塞,非阻塞或超时(或全部三个)。

答案 3 :(得分:0)

既然有人说这是不可能的,我认为应该提供一些替代方案应该很棒。

我通常会做一些服务器代码,我们遇到与数据库同步调用(阻塞)相同的问题。有时(无论出于何种原因)呼叫可能无法快速返回,并且您的处理时间有限。

我们采用的解决方案非常简单,当然涉及MT:

  • 收到查询后,启动一个定时器,在完成时调用回叫
  • 如果您成功完成,请取消激活计时器,现在不需要它。
  • 进行处理,并在每次“阻塞”呼叫后检查计时器(也是在其他常规时间间隔会很好):如果它被解雇了,你已经太长了并且应该放弃处理并且全部急速返回。由于你已经太久了,另一个线程现在负责回答查询。
  • 当计时器触发时,使用回调启动一个新线程,此方法应该以“尽力而为”的方式应答,并且应该避免使用被阻止的呼叫。如果所述BOM正确处理MT(锁定等),它可以使用其他线程使用的BOM

作为习惯问题,我们将计时器设置为可处理请求的最大时间(按请求类别配置)的75%到95%之间的舒适区域。

这使您可以整齐地避免阻止呼叫。如果您不想正确同步BOM(因为它涉及开销),“尽力而为”的答案很可能是一个简单的重试消息(即95%)。如果您要进行清理或以其他方式(缓存?)来回答,您至少需要部分BOM中的同步(即75%)。