Я пытаюсь понять, как работает многопоточность.
У меня есть этот код:
#include <iostream>
#include <thread>
#include <chrono>
void function1() {
std::cout << "Hi I'm the function 1" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "Hi I'm the function 1 after sleeping" << std::endl;
}
void function2() {
std::cout << "Hi I'm the function 2" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(5));
std::cout << "Hi I'm the function 2 after sleeping" << std::endl;
}
int main()
{
while(true) {
std::thread t1(function1);
std::thread t2(function2);
t1.join();
t2.join();
}
system("pause");
return 0;
}
И проблема в том, что когда я запускаю его, он перестает ждать std::this_thread::sleep_for(std::chrono::seconds(5));
и не показывает следующий Hi I'm the function 1
от std::thread t1(function1);
в следующем цикле, пока не закончится поток сна.
1) Знаете почему?
2) Я хочу, чтобы основной продолжил цикл и не ждал окончания t2 (sleep_for () из function2 установлено на 5 секунд)
Вот что делает ваш код:
Вы заявили, что это не то, что вы хотели сделать.
Я думаю, вместо этого вы намеревались иметь «повторить» внутри каждого потока, так что они продолжают тикать независимо и бесконечно, как это:
#include <iostream>
#include <thread>
#include <chrono>
void function1() {
while (true) {
std::cout << "Hi I'm the function 1" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "Hi I'm the function 1 after sleeping" << std::endl;
}
}
void function2() {
while (true) {
std::cout << "Hi I'm the function 2" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(5));
std::cout << "Hi I'm the function 2 after sleeping" << std::endl;
}
}
int main()
{
std::thread t1(function1);
std::thread t2(function2);
t1.join();
t2.join();
}
Теперь ваш код делает это:
Теперь, когда каждый поток вращается независимо, ни один из них не будет «блокировать» другой.
1) Это мой вывод и кажется, что я ожидаю:
Hi I'm the function 1
Hi I'm the function 2
Hi I'm the function 1 after sleeping
Hi I'm the function 2 after sleeping
Hi I'm the function 1
Hi I'm the function 2
Hi I'm the function 1 after sleeping
Hi I'm the function 2 after sleeping
Hi I'm the function 2
Hi I'm the function 1
Hi I'm the function 1 after sleeping
Hi I'm the function 2 after sleeping
Hi I'm the function 2
Hi I'm the function 1
Hi I'm the function 1 after sleeping
Hi I'm the function 2 after sleeping
Hi I'm the function 2
Hi I'm the function 1
2) Что вы имеете в виду для лучшей производительности ???? sleep_for()
работает везде, пока Sleep
это конкретные окна ….
Я предлагаю использовать библиотеку STD, где вы можете, где положить сна зависит от вашего контекста …
Когда вы присоединяетесь к потоку, он завершает его выполнение и завершает работу. Следовательно, когда вы присоединяетесь к своей теме, t1.join (); и t2.join (); второй оператор будет выполняться только после завершения первого оператора соединения. Так что в вашем случае, чтобы непрерывно сгибать нити и выполнять параллельно, вы должны отсоединять нити, как показано ниже:
int i = 0;
while(true) {
std::thread t1(function1);
std::thread t2(function2);
t1.detach();
t2.detach();
//also break your infinite loop here
if( ++i < 4)
break;
}