c++ 如何中断另一个线程?

czfnxgou  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(112)

我正在阅读 CPP-Concurrency-In-Action-2 ed-2019 这本书。在9.2.1章中,作者给出了一个简单的例子来说明如何实现一个基本的interruptible_thread:

class interrupt_flag
{
public:
  void set();
  bool is_set() const;
};
thread_local interrupt_flag this_thread_interrupt_flag;  // 1

class interruptible_thread
{
  std::thread internal_thread;
  interrupt_flag* flag;
public:
  template<typename FunctionType>
  interruptible_thread(FunctionType f)
  {
    std::promise<interrupt_flag*> p;  // 2
    internal_thread=std::thread([f,&p]{  // 3
      p.set_value(&this_thread_interrupt_flag);
      f();  // 4
    });
    flag=p.get_future().get();  // 5
  }
  void interrupt()
  {
    if(flag)
    {
      flag->set();  // 6
    }
  }
};

字符串
但关于它,我有几个奇迹。
1.如果新线程中的p.set_valueinterruptible_thread的构造函数之后运行,那么std::promise p是否会成为一个悬空引用,因为p只是构造函数中的一个局部变量?
1.使用std::promise p的目的是什么?如果只使用flag=&this_thread_interrupt_flag,通过传入flag,这是否相同?
1.当我调用interrupt()时,它怎么会中断新线程,我没有看到任何触发器?

ruoxqz4g

ruoxqz4g1#

因为1)promise对象不会超出作用域,因为在线程启动后您调用

flag=p.get_future().get();

字符串
并且future::get被阻塞直到结果准备好。这可能已经回答了你的第二个问题:promise和future用于确保构造函数阻塞,直到线程中的特定行被执行。
对于3)我还不知道,我认为这取决于interrupt_flag的特定实现,并且可能暗示了对传递给线程的可调用对象的一些要求。
==编辑==
Q3)是的,请继续阅读,一些抛出异常的基本示例已经在第9.2.2章中解释过了;然后你会得到一些更高级的片段。

相关问题