提问人:f1msch 提问时间:8/8/2023 更新时间:8/8/2023 访问量:93
如何中断另一个线程?
How to interrupt another thread?
问:
我正在阅读 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
}
}
};
但关于它,我有几个奇迹。
- 如果在新线程中,在 的构造函数之后运行,那么 std::p romise 不会成为悬空引用,因为构造函数中只是一个局部变量?
p.set_value
interruptible_thread
p
p
- 使用 std::p romise 的目的是什么?那只是通过传入使用是一样的吗?
p
flag=&this_thread_interrupt_flag
flag
- 当我调用时,它怎么会中断新线程,我没有看到任何触发器?
interrupt()
答:
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 章中解释过;然后,您将获得一些更高级的片段。
评论
volatile
attribute((weak))
volatile
volatile
p
atomic
p