我正在阅读 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_value
在interruptible_thread
的构造函数之后运行,那么std::promise p
是否会成为一个悬空引用,因为p
只是构造函数中的一个局部变量?
1.使用std::promise p
的目的是什么?如果只使用flag=&this_thread_interrupt_flag
,通过传入flag
,这是否相同?
1.当我调用interrupt()
时,它怎么会中断新线程,我没有看到任何触发器?
1条答案
按热度按时间ruoxqz4g1#
因为1)promise对象不会超出作用域,因为在线程启动后您调用
字符串
并且future::get被阻塞直到结果准备好。这可能已经回答了你的第二个问题:promise和future用于确保构造函数阻塞,直到线程中的特定行被执行。
对于3)我还不知道,我认为这取决于
interrupt_flag
的特定实现,并且可能暗示了对传递给线程的可调用对象的一些要求。==编辑==
Q3)是的,请继续阅读,一些抛出异常的基本示例已经在第9.2.2章中解释过了;然后你会得到一些更高级的片段。