c ++多线程:执行顺序

时间:2016-06-06 14:05:17

标签: c++ multithreading

我已经完成了测试,但我没有弄清楚线程的执行顺序。

这是我的代码:

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秒---&gt; &#34; func1func2 \ n \ n&#34;显示---&gt;等待 8 秒---&gt; &#34; Hello world&#34;显示。

如果我更改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秒---&gt; &#34; func1func2 \ n \ n&#34;显示---&gt;等待 4 秒---&gt; &#34; Hello world&#34;显示。
在这种情况下,似乎主线程和t和t2同时等待4秒。

如何解释所有这些?

1 个答案:

答案 0 :(得分:0)

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

在你的第一种情况下,两个线程开始,并在4秒后打印&#34; funcX&#34; (这与他们的功能相对应)。 主线程将等待线程加入(连接方法的目的),然后在打印&#34; hello world&#34;之前等待8秒。 :join方法将阻止主线程的执行,直到完成线程。

在第二种情况下,线程在等待8秒后加入:实际上主线程和其他两个在同一时间等待。所以在4秒后他们打印他们的消息,4秒后(主要已经等了4秒)&#34;你好世界&#34;出现了!

希望它能帮助你理解这里发生的事情!