2016-02-26 2 views
1

Что является самым простым способом выйти из этой петли while, пока она еще спит? Есть ли какая-то функция, которая может определить, истинно ли значение во время сна?
Или я настраиваю небольшой сон в петле и проверяю, чтобы выйти, если не спать еще? если да, как бы я это сделал?выход во время длительного сна

 std::atomic<bool> _execute; 

     while (_execute.load(std::memory_order_acquire)) 
     { 
      //do stuff 

      //How to exit druing this long sleep 
      std::this_thread::sleep_for(std::chrono::minutes(_Delay)); 
     } 
+1

Итак, что такое '_execute.load (std :: memory_order_acquire)' точно? Соответственно, какой тип '_execute'? –

+1

Не важно, что он делает, im пытается выйти из сна, 'std :: atomic _execute;' – ramafe

ответ

8

Есть ли какая-то функция, которая может обнаружить, если значение истинно во время сна?

Нет такого метода, чтобы разбить вызов 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 ... 

и привести к приостановке текущей нити.

+0

+1 для 'wait_unitl()'; [переменные условия] (http://www.cplusplus.com/reference/condition_variable/condition_variable/) (помогал мне получить обзор). – holzkohlengrill

3

Вы написали код, чтобы буквально ничего не делать для x минут; теперь вы вместо этого хотите, чтобы это делало (проверяя условие) в течение этого времени. Вы не можете иметь это в обоих направлениях!

Замените sleep с ожиданием на переменной состояния.

+0

_execute.load (std :: memory_order_acquire) - это условие, очевидно, это не мой код, это пример того, что я хочу делать. – ramafe

+1

Это звучит скорее как проблема с дизайном в вашем коде. – holzkohlengrill

+1

@ramafe Итак, вы опубликовали вопрос, отличный от вашего кода? Нет, это непонятно. – Yakk

Смежные вопросы