关于std::jthread::join阻塞机制与线程执行行为的疑问
std::jthread并发与join阻塞的常见误解解析
#include <iostream> #include <thread> using namespace std::literals; void print(std::string msg) { while (true) { std::cout << msg << '\n'; std::this_thread::sleep_for(3s); } } int main() { std::jthread t1{ print, "Hello world!" }; std::jthread t2{ print, "Batman" }; t1.join(); std::cout << "Is not printed\n"; t2.join(); return 0; }
核心误解点:线程启动时机与join的作用
你混淆了线程启动和**线程等待(join)**的时机:
std::jthread的构造函数会立刻启动目标线程,不是等到调用join()的时候才启动。所以main函数里,创建t1的语句执行完,print("Hello world!")的线程已经在后台跑起来了;紧接着主线程继续执行创建t2的语句,print("Batman")的线程也立刻启动并发执行。join()的作用只是阻塞当前线程(这里是主线程),直到被join的线程执行完毕。它不负责启动线程,只负责等待。
具体行为拆解
- 主线程先执行
t1的构造:启动t1线程,开始无限循环输出"Hello world!"。 - 主线程继续执行
t2的构造:启动t2线程,开始无限循环输出"Batman"。 - 主线程走到
t1.join():此时主线程被阻塞,因为t1是无限循环永远不会结束,所以主线程会一直卡在这里,永远到不了std::cout << "Is not printed\n"这一行,更不会执行t2.join()。
为什么会同时输出两个字符串?
因为t1和t2的线程在主线程调用t1.join()之前就已经都启动了,两个线程各自独立运行,每3秒输出一次自己的消息,所以你会看到两者交替(或同时,取决于系统调度)输出。
内容的提问来源于stack exchange,提问作者TwistedBlizzard
相关产品推荐
相关产品推荐

