c++ - 加入线程如何影响主线程中的执行顺序?

标签 c++ multithreading

我知道线程是并发运行的,所以你无法预测执行顺序,但在提供的代码中,我在运行其他任何东西之前加入了线程 t4。如果 .join() 应该等到线程完成执行,那么为什么顺序仍然是随机的?在两个 print 语句之前加入任何内容总是会导致它们最后打印,而如果我在之后加入所有内容,它并不总是最后,为什么?

void task() {
    std::cout << "task 1 says Hi\n";
}
void task2() {
    std::cout << "task 2 says Hi\n";
}
void task3() {
    std::cout << "task 3 says Hi\n";
}
void task4() {
    std::cout << "task 4 says Hi\n";
}
int main() {
    std::thread t1(task);
    std::thread t2(task2);
    std::thread t3(task3);
    std::thread t4(task4);

    t4.join();
    std::cout << "main says Hi 1\n";
    // synchronize - IMPORTANT!
    t2.join();
    t3.join();
    t1.join();
    std::cout << "main says Hi 2" << std::endl;
    system("pause");
}

最佳答案

std::thread::join只阻塞当前线程,直到 *this 标识的线程完成执行。

所以这向您保证 main says Hi 1 不会在 task 4 says Himain says Hi 2 之前打印在其他三个任务完成执行之前不会打印。

四个任务中的printf语句可以任意顺序打印,不同线程的输出也可能交错。

关于c++ - 加入线程如何影响主线程中的执行顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55625580/

相关文章:

c++ - 自动将一个对象添加到该对象父对象的 vector 中

java - 异步运行任务并在线程 Activity 后返回

java - Java 中的 "implements Runnable"与 "extends Thread"

c++ - boost Asio 单线程性能

c++ - 有没有办法在下一个命令之前等待 GPU 的最后一个命令?

c++ - 是否在声明内的参数替换后评估 require-clauses?

c++ - 链接到依赖于第三方库的库

multithreading - 并行遍历图形

Ruby:救援不会从线程中救援

c# - 需要帮助跨 UI 线程和 C# 中的另一个线程获取信息