阻塞线程中断

时间:2015-06-04 06:36:08

标签: c++ multithreading blocking

以下流程函数从队列中读取数据并对其进行处理。 $files = mysql_query("SELECT * FROM files WHERE unpublish=0 and year(date)=(SELECT MAX(YEAR(date) FROM files) ORDER BY files.date DESC"); 的{​​{1}}功能会执行阻止呼叫。因此,在队列中存在可读取的数据之前,控制不会继续前进。

wait_and_pop

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

masterQueue

因为,当抛出信号时,thread2没有推送新数据,所以thread1中的控制被卡在

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);
    }
  }
};

如何强制阻止此阻止呼叫?

  1. 是否可以在不更改wait_and_pop
  2. 的内部工作的情况下实现此目的
  3. 暂停超时不是一种选择,因为数据可能会在几小时或一秒钟内多次到达队列
  4. 我是否在接收信号时推送特定类型的数据,例如INT_MAX / INT_MIN,过程功能被编码识别并退出循环。

2 个答案:

答案 0 :(得分:0)

超时实际上是你的答案 你在获得答案或中断时打破了循环

你也可以通过使用一个noop到队列

来欺骗一些东西

答案 1 :(得分:0)

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

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