在C++20中,引入了
此外,引入了合作式取消的概念,这样一个
我的内容大致如下。
std::jthread
作为std::thread
的更安全版本;据我理解,std::jthread
在线程退出时会自行清理。此外,引入了合作式取消的概念,这样一个
std::jthread
可以管理一个处理底层线程状态的std::stop_source
,这个std::stop_source
公开了一个std::stop_token
,外部用户可以使用它来合理地读取线程状态。我的内容大致如下。
class foo {
std::stop_token stok;
std::stop_source ssource;
public:
void start_foo() {
// ...
auto calculation = [this](std::stop_token inner_tok) {
// ... (*this is used here)
while(!inner_tok.stop_requested()) {
// stuff
}
}
auto thread = std::jthread(calculation);
ctok = thread.get_stop_token();
ssource = thread.get_stop_source();
thread.detach(); // ??
}
void stop_foo() {
if (ssource.stop_possible()) {
ssource.request_stop();
}
}
~foo() {
stop_foo();
}
}
注意 foo
由 std::shared_ptr
管理,并且没有公共构造函数。
在某个时刻,另一个线程可以在可能分离的线程上调用 foo::stop_foo()
。
我所做的是否安全?
此外,当分离线程时,C++ 句柄不再与运行线程关联,而是由操作系统管理,但线程是否仍然接收来自 std::stop_source
的停止通知?
有没有更好的方法来实现我��需的功能?在 MVSC 中,这似乎没有引发任何异常或停止程序执行,并且我已经进行了大量测试以验证此点。
那么,这个解决方案是否可移植?
foo
实例上调用多次start_foo()
,会发生什么,请思考。 “线程是否一直接收来自std::stop_source
的停止通知”-stop_source
拥有一个共享状态。您和分离的线程都持有stop_source
对象,这些对象共享单个状态。因此,在分离的线程仍在运行时,您仍然可以发送信号。 - Remy Lebeaufoo
超出范围时它会停止,那为什么不让jthread
做它的事情呢? - Ted Lyngmofoo::stop_foo
超出范围时自动停止" - 你的意思是使用start_foo()
。无论如何,这个问题只是因为你将thread
声明为start_foo()
的局部变量。如果你将其作为类成员存储(就像你对stop_source
和stop_token
所做的那样,它们可以移动到stop_foo()
中作为局部变量),那么分离就不再是一个问题了。stop_foo()
仍然可以停止线程(如果它正在运行),并且~foo()
可以在停止线程后join()
线程,以确保它正常结束。 - Remy Lebeau