Есть ли какая-то функция, которая может обнаружить, если значение истинно во время сна?
Нет такого метода, чтобы разбить вызов std::this_thread::sleep_for()
в той же теме. Поток приостанавливается в течение более или менее времени, указанного в аргументе std::chrono::duration
.
Самый простой способ выйти из этого цикла while, пока он еще спит?
Или я настраиваю небольшой сон в петле и проверяю, чтобы выйти, если не спать еще? если да, как бы я это сделал?
Не позволяйте ему спать (так долго).
Вместо sleep_for()
Вы можете использовать переменную условия и wait_for()
для сигнализации, чтобы выйти из цикла (из другого потока).
Как вы выяснили, что в вашем comment, вместо того, чтобы использовать std::atomic<bool>
вы должны реорганизовать свой код немного (опять же с помощью переменной условия):
#include <iostream>
#include <chrono>
#include <thread>
#include <condition_variable>
#include <mutex>
const std::chrono::seconds MainDelay = std::chrono::seconds(5);
const std::chrono::seconds WorkerTimeResolution = std::chrono::seconds(2);
std::mutex cv_m;
std::condition_variable cv;
bool _execute = false;
void worker_thread() {
std::unique_lock<std::mutex> lk(cv_m);
while (cv.wait_for(lk,WorkerTimeResolution,[](){return _execute ;})) {
// do stuff as long _execute is true,
// may be with more varying timing conditions than sleep_for() ...
std::cout << "Worker thread executing ..." << std::endl;
std::this_thread::sleep_for(WorkerTimeResolution);
}
}
int main() {
std::thread t(worker_thread);
_execute = true;
cv.notify_all();
for(int i = 0; i < 3; ++i) {
// Do other stuff, may be with more varying timing conditions ...
std::this_thread::sleep_for(MainDelay);
std::cout << "Main thread executing ..." << std::endl;
}
_execute = false;
cv.notify_all();
t.join();
}
Online Demo
Обратите внимание, что существует ряд возможных операций, а не std::this_thread::sleep_for()
, которые могут быть синхронизированы в
// Do stuff ...
и привести к приостановке текущей нити.
Итак, что такое '_execute.load (std :: memory_order_acquire)' точно? Соответственно, какой тип '_execute'? –
Не важно, что он делает, im пытается выйти из сна, 'std :: atomic _execute;' –
ramafe