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();