c++ - 阻塞线程中断

标签 c++ multithreading blocking

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

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

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

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 中的控制停留在

_masterQueue.wait_and_pop(data);

如何强制中断此阻塞调用?

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

最佳答案

超时其实就是你的答案 你在得到答案或被打扰时打破了循环

您还可以通过让中断将 noop 推送到队列来进行一些欺骗

关于c++ - 阻塞线程中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30636619/

相关文章:

Java 并发 hashmap 缺失值

c++ - Visual Studio 2013 C++ native 代码中与互锁操作的线程同步挂起

c - OpenCV 'cvQueryFrame' 在 OS X 上非阻塞?

Javascript 阻止 css?

c++ - 有没有办法使用模板来防止类在 C++ 中被派生

c++ - 指向整数指针数组的双指针;返回整数&

c# - LoadLibrary、FreeLibrary 和 GetModuleHandle Win32 函数线程安全吗?

javascript - 关于代码执行和javascript阻塞/非阻塞性质的问题

c++ - 这个重新分配是否正确?

c++ - 从 Ubuntu 中的 Qt GUI 应用程序运行多个命令行应用程序并获取控制台输出