Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;多线程:执行顺序_C++_Multithreading - Fatal编程技术网

C++ c++;多线程:执行顺序

C++ c++;多线程:执行顺序,c++,multithreading,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)); s

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

这是我的代码:

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;
}
我可以得到与上面相同的结果。

但是,如果我这样更改它:

std::this_thread::sleep_for(std::chrono::milliseconds(8000));
t.join();
t2.join();
结果是:
等待4秒--->“func1func2\n\n”显示--->等待4sec--->“Hello world”显示。
在本例中,主线程与t和t2似乎同时等待4秒

如何解释所有这些?

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

在第一种情况下,两个线程启动,4秒后打印“funcX”(对应于它们的函数)。 主线程将等待线程连接(连接方法的目的),然后在打印“hello world”之前等待8秒:连接方法将阻止主线程的执行,直到线程完成

在第二种情况下,线程在等待8秒后连接:事实上,主线程和其他两个线程同时等待。因此,4秒钟后,他们打印消息,4秒钟后(主屏幕已经等待了4秒钟)出现“hello world”(你好世界)

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

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

在第一种情况下,两个线程启动,4秒后打印“funcX”(对应于它们的函数)。 主线程将等待线程连接(连接方法的目的),然后在打印“hello world”之前等待8秒:连接方法将阻止主线程的执行,直到线程完成

在第二种情况下,线程在等待8秒后连接:事实上,主线程和其他两个线程同时等待。因此,4秒钟后,他们打印消息,4秒钟后(主屏幕已经等待了4秒钟)出现“hello world”(你好世界)


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

并行运行正是线程的用途。只有在调用
join
时,一个线程才会等待另一个线程的完成状态。所以在最后一种情况下,线程等待4秒,完成,主线程同时等待8秒,然后在
join
上不必等待,因为两个线程都已完成,并输出“Hello World”。并行运行正是线程的用途。只有在调用
join
时,一个线程才会等待另一个线程的完成状态。所以在最后一种情况下,线程等待4秒,完成,主线程同时等待8秒,然后在
join
上不必等待,因为两个线程都完成了,并输出“Hello World”。实际上有3种情况。你能解释一下第二个吗<代码>t.join main.waitfor(8秒)t2.join?我认为您的“第二个案例”是我的“第三个案例”。您的评论中给出的案例将如下执行:(误用了我的kb,对不起)您似乎很难理解的是join()方法的用法:该方法告诉main等待线程完成。但是,线程可以在此之前完成。对于第一种情况,
join
阻塞了主线程,因此在两个线程中的4秒之后,主线程仍应等待8秒。对于第三种情况,主线程和两个线程一起运行,因此它们一起等待4秒。但是对于第二种情况,我不明白:
t.join
阻塞了主线程,对吗?为什么t和t2仍然可以同时执行?在我看来,应该是:等待4秒---->显示func1---->等待4秒---->显示func2---->等待4秒---->显示Hello World。因为join不会运行线程,而是等待它。线程2将在执行这一行的确切时刻开始:std::thread t2(func2);如果您希望得到预期的结果,请尝试类似这样的方法:线程t1、t1.join()、main.wait()、线程t2、t2.join()实际上有3种情况。你能解释一下第二个吗<代码>t.join main.waitfor(8秒)t2.join?我认为您的“第二个案例”是我的“第三个案例”。您的评论中给出的案例将如下执行:(误用了我的kb,对不起)您似乎很难理解的是join()方法的用法:该方法告诉main等待线程完成。但是,线程可以在此之前完成。对于第一种情况,
join
阻塞了主线程,因此在两个线程中的4秒之后,主线程仍应等待8秒。对于第三种情况,主线程和两个线程一起运行,因此它们一起等待4秒。但是对于第二种情况,我不明白:
t.join
阻塞了主线程,对吗?为什么t和t2仍然可以同时执行?在我看来,应该是:等待4秒---->显示func1---->等待4秒---->显示func2---->等待4秒---->显示Hello World。因为join不会运行线程,而是等待它。线程2将在执行这一行的确切时刻开始:std::thread t2(func2);如果希望得到预期的结果,请尝试以下操作:线程t1、t1.join()、main.wait()、线程t2、t2.join()
std::this_thread::sleep_for(std::chrono::milliseconds(8000));
t.join();
t2.join();