如何中断另一个线程?

How to interrupt another thread?

提问人:f1msch 提问时间:8/8/2023 更新时间:8/8/2023 访问量:93

问:

我正在阅读 CPP-Concurrency-In-Action-2ed-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. 如果在新线程中,在 的构造函数之后运行,那么 std::p romise 不会成为悬空引用,因为构造函数中只是一个局部变量?p.set_valueinterruptible_threadpp
  2. 使用 std::p romise 的目的是什么?那只是通过传入使用是一样的吗?pflag=&this_thread_interrupt_flagflag
  3. 当我调用时,它怎么会中断新线程,我没有看到任何触发器?interrupt()
C++ 多线程

评论

0赞 Basile Starynkevitch 8/8/2023
考虑在带有 GCC 编译器的 Linux 计算机上使用volatileattribute((weak))
1赞 Mat 8/8/2023
请注意,jthread 现在可用,并且很好地打包了此功能。
2赞 Alan Birtles 8/8/2023
@BasileStarynkevitch现代 C++ 中的用途很少,我看不出它在这里有什么关系?volatile
0赞 Basile Starynkevitch 8/8/2023
@AlanBirtles:我知道 f1msch 询问的是硬件中断。然后可能是相关的。可能需要一些聪明的指针......?还是某个?volatilepatomic
3赞 Alan Birtles 8/8/2023
@BasileStarynkevitch 我在问题中没有看到对硬件中断的引用。 按原样完美运行,无需修改p

答:

3赞 pptaszni 8/8/2023 #1

对于 1) promise 对象不会超出范围,因为在线程启动后你调用

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

future::get 处于阻塞状态,直到结果准备就绪。然后 这可能已经回答了你的第二个问题:promise 和 future 用于确保构造函数阻塞,直到线程中的特定行被执行。

对于 3) 我还不知道,我认为这取决于特定的实现,并且可能意味着对传递给线程的可调用对象的一些要求。interrupt_flag

== 编辑 ==

Q 3) 是的,请继续阅读,一些基本示例(例外)已在第 9.2.2 章中解释过;然后,您将获得一些更高级的片段。