Я сделал тест, но не знаю порядок выполнения потоков.
C++ многопоточность: порядок выполнения
Вот мой код:
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 \ п \ п" показывается --- > wait for sec ---> Отображается «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 \ п \ п" показывается ---> ожидание для sec ---> «Привет, мир».
Кажется, что основной поток и t и t2 ожидают в течение 4 секунд одновременно.
Как объяснить все это?
Запуск параллельно - это то, для чего предназначены потоки. Только если вы вызываете 'join', один поток ожидает состояние законченного состояния другого. Таким образом, в последнем случае потоки ожидают 4 секунды, заканчивают, основной поток тем временем ждет 8 секунд, а затем на 'join' не нужно ждать, потому что оба потока завершены, и выводит« Hello World ». –