You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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的线程执行完毕。它不负责启动线程,只负责等待。

具体行为拆解

  1. 主线程先执行t1的构造:启动t1线程,开始无限循环输出"Hello world!"。
  2. 主线程继续执行t2的构造:启动t2线程,开始无限循环输出"Batman"。
  3. 主线程走到t1.join():此时主线程被阻塞,因为t1是无限循环永远不会结束,所以主线程会一直卡在这里,永远到不了std::cout << "Is not printed\n"这一行,更不会执行t2.join()。

为什么会同时输出两个字符串?

因为t1和t2的线程在主线程调用t1.join()之前就已经都启动了,两个线程各自独立运行,每3秒输出一次自己的消息,所以你会看到两者交替(或同时,取决于系统调度)输出。

内容的提问来源于stack exchange,提问作者TwistedBlizzard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:22:45