当年写线程。
最尴尬的事情是。
你开得起来。
但你停不干净。
当年:停线程全靠自觉
你会写一个 flag。
bool stop = false;
线程里循环检查。
while (!stop) {
// work
}
能跑。
但它有两种很常见的坑。
第一。
你忘了检查。
第二。
线程被阻塞了。
它根本没机会看到 stop。
线上啪一下:服务要重启,结果卡在 join 上
你写了个小服务。
有个后台线程。
定时刷缓存。
std::thread t([&] {
while (!stop) {
do_work();
std::this_thread::sleep_for(1s);
}
});
你关服务的时候。
调用 t.join()。
有时候它会卡。
因为线程可能在 sleep。
你得等它醒。
这个“等”。
线上就会变成优雅退出失败。
C++20:std::jthread
std::jthread 的第一个好处。
是析构会自动 join。
少一个“忘了 join”就泄露线程的坑。
#include <thread>
std::jthread t([] {
// work
});
第二个好处:stop_token
jthread 会带一个 stop 机制。
线程函数可以接收一个 std::stop_token。
#include <thread>
std::jthread t([](std::stop_token st) {
while (!st.stop_requested()) {
// work
}
});
你想停。
就请求停止。
t.request_stop();
它表达的不是“共享变量”。
它表达的是一种约定。
“我支持取消”。
你刚学 C++ 会卡:这是不是强制把线程杀掉
不是。
它不会暴力终止线程。
它只是发出一个“请你停”的信号。
能不能停。
取决于线程逻辑有没有配合。
但至少。
这个配合方式被标准化了。
关键结论
线程的退出。
比启动更重要。
小结
jthread 帮你少踩两个坑。
一个是忘记 join。
一个是取消信号没有统一写法。
它不会替你写并发。
但它会让并发更像工程。