- 它相对于
std::thread
有什么优势? - 它会使现有的
std::thread
过时吗?
std::thread
有什么优势?std::thread
过时吗?std::jthread
类似于 std::thread
,但没有那个愚蠢的问题。看,std::thread
的析构函数会在你没有手动调用 join
或 detach
时终止程序。这导致了大量的bug,因为人们希望它在析构时自动加入线程。
jthread
解决了这个问题;默认情况下,它在析构时自动加入线程(因此命名为“joining thread”)。它还支持一种请求线程停止执行的机制,但没有强制要求这样做(也就是说:你不能强制让其他线程停止执行)。
目前,没有计划废弃std::thread
。
std::stop_token
作为函数的第一个参数,并定期检查 stop_requested
是否为真。 - Calethstruct jthread : std::thread { using std::thread::thread; ~jthread() { join(); } };
(故意省略了停止)。这意味着:a. 如果线程中的函数返回,线程的句柄可以直接析构;b. 如果没有返回,程序将阻塞并等待句柄(jthread对象)销毁时完成。在某些情况下,它可能表现得类似于分离,但绝不相同。 - alagnerstd::jthread
,它是一个“加入线程”,通过其析构函数join()
实现了RAII。加入操作是在析构函数中完成的,因此顺序与构造相反。
在使用std::jthread
时要注意RAII语义。int main() {
long v {0};
std::jthread t([&v]() {
for (size_t i = 0; i++ < 10;)
v++;
});
std::cout << v << ' '; // will print 0
}
std::cout << ...
之后)。int main() {
long v {0};
{
std::jthread t([&v]() {
for (size_t i = 0; i++ < 10;)
v++;
std::cout << v << ' '; // will print 10
});
}
}
这将正确地打印10。
至于std::thread
的弃用,我认为至少在不久的将来不会发生。