【发布时间】: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