当前位置: 首页 > 知识库问答 >
问题:

连接线程如何影响主线程中的执行顺序?

穆博简
2023-03-14

我知道线程是并发运行的,所以您无法预测执行的顺序,但在提供的代码中,我在运行其他代码之前加入了threadT4。如果.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");
}

共有1个答案

杜俊远
2023-03-14

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

因此,这可以保证在任务4显示Hi之前不会打印main显示Hi1并且在其他三个任务完成执行之前不会打印main显示Hi2

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

 类似资料:
  • 我目前在Java的编程课上学习多线程。根据我的理解,不同线程的执行顺序是无法预测的,因此确保我们实现机制以确保所有东西都按所需的顺序执行是很重要的。 我学到的机制之一是使用,它强制一个线程等待,直到其他线程完成执行。然而,下面的示例代码实际上让我更加困惑: 这段代码应该演示是如何工作的,它将执行,然后得到一个正确打印的。 然而,当我实际运行代码时,执行的顺序似乎仍然是随机的。我得到的结果是 那么,

  • 我在Go中有以下代码。Go使用超文本传输协议保持连接。因此,根据我的理解,不会创建新连接,因为Go语言使用默认的持久连接。 > 据我所知,HTTP持久连接一次只能发出一个请求,即第二个请求只能在第一次响应之后发出。然而,如果多个线程调用会发生什么?将在前一个请求得到响应之前是否发送另一个请求? 我假设服务器超时了客户端建立的任何保持活动的连接。如果服务器超时,那么下一次,它会建立新的连接吗?

  • 问题内容: 我尝试从一本书(Paul Hyde,Java Thread Programming)中运行示例。它说线程的顺序将互换。但是我总是得到:之后打印10个“主线程”,然后打印10个“新线程”。更有趣的是:如果我将使用tt.run而不是tt.start,那么结果将相反。也许这本书太老了,示例基于JDK 1.2的原因???代码如下: 问题答案: JVM决定何时将控制权从主线程转移到第二个线程。由

  • 我确信这两个列表都不是空的,并且正在调用,但是没有调用order execution run方法....

  • 根据了解node.js事件循环,node.js支持单线程模型。这意味着如果我向node.js服务器发出多个请求,它不会为每个请求生成一个新线程,而是一个接一个地执行每个请求。这意味着如果我在node.js代码中对第一个请求执行以下操作,同时节点上出现一个新请求,第二个请求必须等到第一个请求完成,包括5秒的睡眠时间。对吗? 有没有一种方法可以让node.js为每个请求生成一个新线程,这样第二个请求就

  • 问题内容: 根据我一直在阅读的定义: 线程基本上是并发(同时)运行的代码段 。 但是,如何在存在线程调度程序的情况下同时运行它们? 我读到,线程调度程序基本上是从线程池中随机选择一个线程在某个时刻运行。从中我得到一个确切的时间点,只有一个可运行线程真正处于运行状态(运行)。( 所有这些均来自SCJP Sun认证程序员学习指南 )有人可以澄清吗? 这些线程是否真正同时运行? 问题答案: 但是,如何在