【问题标题】:c++ multithreading: order of executionc++多线程:执行顺序
【发布时间】:2016-06-06 14:05:16
【问题描述】:

我做了一个测试,但我不知道线程的执行顺序。

这是我的代码:

void func1()
{
    std::this_thread::sleep_for(std::chrono::milliseconds(4000));
    std::cout<<"func1"<<std::endl;
}

void func2()
{
    std::this_thread::sleep_for(std::chrono::milliseconds(4000));
    std::cout<<"func2"<<std::endl;
}
int main()
{
    std::thread t(func1);
    std::thread t2(func2);

    t.join();
    t2.join();
    std::this_thread::sleep_for(std::chrono::milliseconds(8000));

    cout << "Hello World" << endl; 

    return 0;
}

在这种情况下,我得到以下结果:
等待 4 秒 ---> 显示“func1func2\n\n” ---> 等待 8 秒 ---> 显示“Hello world”。

如果我将main 中的代码顺序更改如下:

t.join();
std::this_thread::sleep_for(std::chrono::milliseconds(8000));
t2.join();

我可以得到和上面一样的结果。

但是,如果我这样更改:

std::this_thread::sleep_for(std::chrono::milliseconds(8000));
t.join();
t2.join();

结果变成:
等待 4 秒 ---> 显示“func1func2\n\n” ---> 等待 4 秒 ---> 显示“Hello world”。
在这种情况下,似乎主线程和t和t2同时等待了4秒。

如何解释所有这些?

【问题讨论】:

  • 并行运行正是线程的用途。只有当您调用join 时,一个线程才会等待另一个线程的完成状态。所以在最后一种情况下,线程等待 4 秒,完成,主线程同时等待 8 秒,然后 join 不必等待,因为两个线程都已完成,并输出“Hello World”。跨度>

标签: c++ multithreading


【解决方案1】:

如果不使用锁(在您的情况下通常是信号量),您将无法预测线程的执行顺序。只有您的进程调度程序会确定这一点(非常低的级别,这有助于您的处理器在上下文之间切换)。

在您的第一种情况下,两个线程启动,并在 4 秒后打印“funcX”(对应于它们的功能)。 主线程将等待线程加入(join 方法的目的),然后等待 8 秒再打印“hello world”:join 方法将阻塞主线程的执行,直到线程完成。

在第二种情况下,线程在等待 8sec 后加入:实际上主线程和其他两个线程同时等待。所以 4 秒后他们打印了他们的消息,4 秒后(主已经等了 4 秒)“hello world”出现了!

希望它能帮助您了解这里发生了什么!

【讨论】:

  • 其实有3种情况。你能解释一下第二个吗? t.join main.waitfor(8sec) t2.join?我认为你的“第二种情况”是我的“第三种情况”。
  • 您评论中给出的案例将像这样执行:
  • (误用了我的kb,抱歉)您似乎难以理解的是join() 方法的使用:该方法告诉main 等待线程完成。但是线程可以在此之前完成。
  • 对于第一种情况,join 阻塞了主线程,因此在两个线程的 4 秒后,主线程仍应等待 8 秒。对于第三种情况,主线程和两个线程一起运行,所以它们一起等待 4 秒。但是对于第二种情况,我无法理解:t.join 阻塞了主线程,对吧?为什么 t 和 t2 仍然可以一起执行?在我看来,应该是:等待 4 秒 ---> 显示 func1 ---> 等待 4 秒 ---> 显示 func2 ----> 等待 4 秒 -----> 你好显示世界。
  • 因为 join 不会运行你的线程,而是等待它。线程 2 将在执行此行的确切时刻开始: std::thread t2(func2);如果您想要您期望的结果,请尝试类似:thread t1, t1.join(), main.wait(), thread t2, t2.join()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 2017-08-17
相关资源
最近更新 更多