W C++ 11 funkcje czasu oczekiwania działają zgodnie z oczekiwaniami tylko wtedy, gdy używany jest stały zegar (to znaczy taki, który porusza się tylko do przodu z niezmienną szybkością). Ponieważ system_clock
nie jest stabilny zegar, co oznacza, że kod ten sposób mogą zachowywać się dość zaskakująco:Kiedy należy używać funkcji C++ 11 * _until timeout zamiast odpowiedniej funkcji * _for?
using namespace std::chrono;
std::this_thread::sleep_until(system_clock::now() + seconds(10));
To spowoduje, że bieżący wątek spać przez 10 sekund, chyba że zegar systemowy jest regulowana w okresie uśpienia, na przykład, na czas letni. Jeśli zegar zostanie cofnięty o godzinę podczas snu, bieżący wątek będzie spał przez godzinę i 10 sekund.
Z tego, co wiem, każda funkcja limitu czasu w C++ 11 ma odpowiednią funkcję , która zajmuje czas zamiast punktu czasowego. Na przykład, powyższy kod może zostać przepisany w następujący sposób:
using namespace std::chrono;
std::this_thread::sleep_for(seconds(10));
W *_for
funkcje nie powinny się martwić, że się zegarów skorygowanych gdy funkcja jest wykonywany, bo po prostu powiedzieć, jak długo czekać, co nie czas powinien być, gdy skończy się czas oczekiwania.
Ten problem dotyczy więcej niż funkcji uśpienia, tak samo jest w przypadku czekania opartego na timeoutie na futures i funkcjach try_lock.
Jedyna sytuacja, w której mogę sobie wyobrazić to sensu, aby użyć funkcji *_until
z niepewną zegar będzie, gdy chcesz wziąć regulacji zegara pod uwagę, na przykład, chcesz spać aż do następnej środy na 3: 30:00, nawet jeśli od czasu do czasu następuje zmiana czasu letniego lub z tego okresu. Czy istnieją inne sytuacje, w których funkcje *_until
mają więcej sensu niż funkcje *_for
? Jeśli nie, to czy można z całą pewnością powiedzieć, że funkcje limitu czasu w trybie *_for
powinny być preferowane w stosunku do funkcji *_until
?
Czy to nie zależy od _stotyności _clock_? Czy 'wait_for' i' wait_until' naprawdę zamierzają działać inaczej w obsłudze "skoków zegara"? –
@ K-ballo: Właśnie dlatego specjalnie wspomniałem o stabilności zegarów i ta godzina systemowa nie jest stała. Funkcje '_for' i' _until' zachowują się różnie w odniesieniu do regulacji zegara, ale to, co _intention_ jest, nie jest dla mnie jasne. – KnowItAllWannabe
Ciągłość_ 'system_clock' jest w rzeczywistości zależna od implementacji. –