作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我知道线程是并发运行的,所以你无法预测执行顺序,但在提供的代码中,我在运行其他任何东西之前加入了线程 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 Hi
和 main says Hi 2
之前打印在其他三个任务完成执行之前不会打印。
四个任务中的printf
语句可以任意顺序打印,不同线程的输出也可能交错。
关于c++ - 加入线程如何影响主线程中的执行顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55625580/
我是一名优秀的程序员,十分优秀!