нить и спать

Я пытаюсь понять, как работает многопоточность.

У меня есть этот код:

#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 секунд)

2

Решение

Вот что делает ваш код:

  • Начать тему 1
    • Выводит сообщение
    • Ждет 1 секунду
    • Выводит другое сообщение
  • Начать тему 2
    • Выводит сообщение
    • Ждет 5 секунд
    • Выводит другое сообщение
  • Ожидает окончания обеих нитей
    • (это займет примерно 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
    • Выводит сообщение
    • Ждет 1 секунду
    • Выводит другое сообщение
    • Повторяется до бесконечности
  • Начать тему 2
    • Выводит сообщение
    • Ждет 5 секунд
    • Выводит другое сообщение
    • Повторяется до бесконечности
  • Ожидает окончания обеих нитей
    • (хотя ни когда не будет!)

Теперь, когда каждый поток вращается независимо, ни один из них не будет «блокировать» другой.

3

Другие решения

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, где вы можете, где положить сна зависит от вашего контекста …

0

Когда вы присоединяетесь к потоку, он завершает его выполнение и завершает работу. Следовательно, когда вы присоединяетесь к своей теме, 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;
}
-1
По вопросам рекламы [email protected]