Простая и удобная возможность управления потоками добавлена в С++11. В данной версии появилось пространство имен this_thread
В этом примере мы сконцентрируемся на том, как приостанавливать потоки на определенный промежуток времени.
Как это делается
В этом примере мы напишем короткую программу, которая приостанавливает основной поток на определенные промежутки времени.
1. Сначала включим все необходимые заголовочные файлы и объявим об использовании пространств имен std
chrono_literals
. Второе пространство содержит удобные аббревиатуры для описания промежутков времени:#include
#include
#include
using namespace std;
using namespace chrono_literals;
2. Сразу же приостановим основной поток на 5 секунд 300 миллисекунд. Благодаря пространству имен chrono_literals
int main()
{
cout << "Going to sleep for 5 seconds"
" and 300 milli seconds.\n";
this_thread::sleep_for(5s + 300ms);
3. Последним выражением приостановки являлось relative
absolute
на приостановку. Приостановим поток на 3 секунды, начиная с cout << "Going to sleep for another 3 seconds.\n";
this_thread::sleep_until(
chrono::high_resolution_clock::now() + 3s);
4. Перед завершением программы выведем на экран какое-нибудь сообщение, что укажет на окончание второго периода приостановки.
cout << "That's it.\n";
}
5. Компиляция и запуск программы дадут следующие результаты. В Linux, Mac и других UNIX-подобных операционных системах имеется команда time
time
показывает: она работала 8,32 секунды, это значение примерно равно 5,3 и 3 секундам, на которые мы приостанавливали программу. При запуске программы можно определить промежуток времени между появлением строк, выводимых на консоль:$ time ./sleep
Going to sleep for 5 seconds and 300 milli seconds.
Going to sleep for another 3 seconds.
That's it.
real 0m8.320s
user 0m0.005s
sys 0m0.003s
Как это работает
Функции sleep_for
sleep_until
появились в версии C++11 и находятся в пространстве имен std::this_thread
. Они блокируют выполнение текущего потока (но не процесса или программы) на конкретный промежуток времени. Поток не потребляет время процессора на протяжении блокировки. Он просто помещается операционной системой в неактивное состояние. ОС, конечно же, напоминает себе о необходимости возобновить поток. Самое лучшее заключается в том, что нам не придется волноваться, в какой операционной системе запущена программа, поскольку эту информацию от нас абстрагирует STL.Функция this_thread::sleep_for
chrono::duration
. В простейшем случае это просто 1s
или 5s+300ms
, как это было показано в нашем примере кода. Чтобы получить возможность применять такие удобные литералы, нужно объявить об использовании пространства имен std::chrono_literals;
.Функция this_thread::sleep_until
chrono::time_point
вместо промежутка времени. Это удобно в том случае, если нужно приостановить поток до наступления конкретного момента времени.Точность момента пробуждения зависит от операционной системы. Она будет довольно
Приостановить выполнение потока на короткий промежуток времени также можно с помощью функции this_thread::yield
yield
зачастую менее полезна, чем приостановка на короткий промежуток времени, установленный заранее.