首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阻塞线程中断

阻塞线程中断
EN

Stack Overflow用户
提问于 2015-06-04 06:36:07
回答 2查看 840关注 0票数 1

下面的进程函数从队列中读取数据并对其进行处理。wait_and_pop函数masterQueue执行阻塞调用。因此,在队列中存在可以读取的数据之前,控件不会向前移动。

代码语言:javascript
复制
class Context
{
  void launch()
  {
   boost::thread thread1(boost::bind(&Context::push,this ) );
   boost::thread thread2(boost::bind(&Context::process,this ) );

   std::cout<<"Joining Thread1"<<std::endl;
   thread1.join();
   std::cout<<"Joining Thread2"<<std::endl;
   thread2.join();
  }

  void process()
  {
    Data data;
    while(status)
    {
      _masterQueue.wait_and_pop(data); //Blocking Call

      //Do something with data
    }
  }

  void push()
  {
    while(status)
    {
       //Depending on some internal logic, data is generated
      _masterQueue.push(data);
    }
  }
};

状态是布尔值(在全局范围内)。默认情况下,此布尔值设置为true。只有当信号被捕获时,如SIGINT、SIGSESV等,才会将其更改为假。在这种情况下,可以退出when循环,并且程序可以安全退出。

代码语言:javascript
复制
bool status = true;

void signalHandler(int signum)
{
  std::cout<<"SigNum"<<signum;
  status = false;
  exit(signum);
}

int main()
{
  signal(SIGABRT, signalHandler);
  signal(SIGINT, signalHandler);
  signal(SIGSEGV, signalHandler);
  Context context;
  context.launch();
}

由于当抛出信号时,thread2不推送新的数据,所以thread1中的控件被卡在

代码语言:javascript
复制
_masterQueue.wait_and_pop(data);

我如何迫使这个阻塞呼叫被中断?

  1. 是否可以在不改变wait_and_pop内部工作方式的情况下实现这一点?
  2. 放置超时不是一种选择,因为数据可能在几个小时内到达队列一次,或者每秒多次到达队列。
  3. 我是否在接收信号时推送特定类型的数据,例如INT_MAX/INT_MIN,该处理函数被编码以识别并退出循环。
EN

回答 2

Stack Overflow用户

发布于 2015-06-04 06:42:05

超时--实际上是你的答案--你在得到答案或中断时中断了循环。

您还可以通过让插入中断将一个noop推送到队列中来稍微欺骗一些事情。

票数 0
EN

Stack Overflow用户

发布于 2015-06-04 09:12:05

当需要完成时,您可以尝试.interrupt()线程。

如果.wait_and_pop()使用标准的boost机制来等待(条件变量或类似),那么即使在阻塞状态下,它也一定会通过抛出boost::thread_interrupted异常而被中断。如果您的masterQueue类是可靠的wrt异常,那么这种中断是安全的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30636619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档