2010-06-18 14 views
20

Niedawno natknąłem się na potrzebę spania bieżącego wątku przez dokładny okres czasu. Wiem o dwóch metodach działania na platformie POSIX: używanie nanosleep() lub używanie boost::this_thread::sleep().boost :: this_thread :: sleep() vs. nanosleep()?

Z ciekawości bardziej niż cokolwiek innego, zastanawiałem się, jakie są różnice między tymi dwoma podejściami. Czy istnieje jakakolwiek różnica w precyzji i czy istnieje jakiś powód, dla którego nie użyć metody Boost?

nanosleep() podejście:

#include <time.h> 
... 
struct timespec sleepTime; 
struct timespec returnTime; 
sleepTime.tv_sec = 0; 
sleepTime.tv_nsec = 1000; 
nanosleep(&sleepTime, &returnTime); 

podejście doładowania:

#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/thread/thread.hpp> 
... 
boost::this_thread::sleep(boost::posix_time::nanoseconds(1000)); 
+3

Tylko mała uwaga do przykładu: "nanosekundy" nie są dostępne we wszystkich systemach. Używanie 'mikrosekund" byłoby bezpieczniejsze. – real4x

Odpowiedz

26

Kilka powodów, dla których stosowanie doładowania, że ​​mogę myśleć:

  • boost::this_thread::sleep() jest punktem przerwa w boost.thread
  • boost::this_thread::sleep() może być drop-in zastąpiony przez C++ 0x na std::this_thread::sleep_until() w przyszłość

Dlaczego nie - jeśli w ogóle nie używasz nici lub wszystkiego innego w sobie r projekt wykorzystuje wywołania POSIX, a następnie nanosleep() ma więcej sensu.

Jeśli chodzi o precyzję, w moim systemie zarówno boost, jak i nanosleep() wywołują to samo wywołanie systemowe, hrtimer_nanosleep(). Wyobrażam sobie, że autorzy ulepszania starają się uzyskać najwyższą możliwą precyzję w każdym systemie i dla mnie jest to to samo co zapewnia nanosleep().

+6

+1 - należy zauważyć, że czas oparty na snach wątków - nawet w trybie nanosylek - jest w najlepszym wypadku niewiarygodny. –

+0

Jednym z powodów używania 'this_thread :: sleep()' jest to, że wymaga czasu w dowolnie wybranych jednostkach: 'sleep (sekundy (10))', 'sleep (nanosekundy (10))', 'sleep (attoseconds (10))) '. Rozdzielczość sprzętu nie zmienia się, ale niezależnie od oferowanej rozdzielczości, można odsłonić bez potrzeby wprowadzania nowych interfejsów API trybu uśpienia ("sleep", "usleep", "nanosleep" itp.). – bames53

4

jest jakiś powód, aby nie używać podejścia Boost,

przypuszczam to jest raczej oczywiste, ale jedynym powodem, dla którego mogę myśleć, jest to, że potrzebujesz bodźca t o skompiluj swój projekt.

+0

Przypuszczam, że powinienem był powiedzieć, że projekt już korzysta z innych bibliotek doładowania. Niemniej jednak, należy odpowiedzieć na ogólne pytanie. –

5

A może dlatego, że przykład twojego nanosaju jest błędny.

#include <time.h> 
... 
struct timespec sleepTime; 
struct timespec time_left_to_sleep; 
sleepTime.tv_sec = 0; 
sleepTime.tv_nsec = 1000; 
while((sleepTime.tv_sec + sleepTime.tv_nsec) > 0) 
{ 
    nanosleep(&sleepTime, &time_left_to_sleep); 
    sleepTime.tv_sec = time_left_to_sleep.tv_sec; 
    sleepTime.tv_nsec = time_left_to_sleep.tv_nsec; 
} 

Wprawdzie jeśli sypiasz tylko do 1 mikrosekundy budzi się zbyt wcześnie, nie powinno być problemu, ale w ogólnym przypadku jest to jedyny sposób, aby to zrobić.

I tylko po to, aby przełamać ciasto na korzyść, boost::this_thread::sleep() jest zaimplementowane przy użyciu nanosleep(). Po prostu zaopiekowali się dla ciebie obłędnymi narożnikami.

+0

+1, doszedłem do wniosku, że funkcja 'sleep()' zostanie zaimplementowana za pomocą 'nanosleep()', dobrze by mieć potwierdzenie. –

+0

Gdzie widzisz snu zaimplementowany za pomocą opcji nanoselek? W wątku.hpp widzę: inline void sleep (xtime const i abs_time) {sleep (system_time (abs_time)); } – clemahieu

+0

@clemahieu: To nie jest połączenie z ':: sleep' (w przeciwnym razie ograniczałbyś się do rozdzielczości sekund). Jest to wywołanie jednego z wielu innych przeciążeń 'boost :: this_thread :: sleep', których definicja znajduje się w' libs/thread/src/pthread/thread.cpp'. –

2

Dla mnie głównym powodem zastosowania wariantu doładowania jest niezależność platformy. Jeśli na przykład wymagane jest skompilowanie aplikacji zarówno dla platform POSIX, jak i Windows, sen platformy jest niewystarczający.

Powiązane problemy