2010-06-18 19 views
20

Gần đây tôi đã bắt gặp sự cần thiết phải ngủ chủ đề hiện tại trong một khoảng thời gian chính xác. Tôi biết hai phương pháp làm như vậy trên nền tảng POSIX: sử dụng nanosleep() hoặc sử dụng boost::this_thread::sleep().boost :: this_thread :: sleep() so với nanosleep()?

Ngoài sự tò mò hơn bất cứ điều gì khác, tôi đã tự hỏi sự khác biệt giữa hai cách tiếp cận là gì. Có sự khác biệt về độ chính xác không và có bất kỳ lý do nào không không để sử dụng phương pháp Tăng cường không?

nanosleep() cách tiếp cận:

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

Boost cách tiếp cận:

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

Chỉ một lưu ý nhỏ cho ví dụ: 'nano giây 'không khả dụng trên tất cả các hệ thống. Sử dụng 'micro giây 'sẽ an toàn hơn. – real4x

Trả lời

26

Vài lý do tại sao sử dụng tăng mà tôi có thể nghĩ đến:

  • boost::this_thread::sleep() là một điểm gián đoạn trong boost.thread
  • boost::this_thread::sleep() có thể thả trong thay thế bằng C++ 0x của std::this_thread::sleep_until() trong tương lai

Vì sao không - nếu bạn không sử dụng chủ đề nào hoặc mọi thứ khác trong bạn r dự án sử dụng các cuộc gọi POSIX, sau đó nanosleep() có ý nghĩa hơn.

Đối với độ chính xác, trên cả hệ thống của tôi đều tăng và nanosleep() gọi cùng một cuộc gọi hệ thống, hrtimer_nanosleep(). Tôi tưởng tượng các tác giả tăng cường cố gắng để có được độ chính xác cao nhất có thể trên mỗi hệ thống và đối với tôi nó xảy ra là giống như những gì nanosleep() cung cấp.

+6

+1 - cần lưu ý rằng thời gian dựa trên giấc ngủ của chủ đề - thậm chí là nanosleep - không đáng tin cậy ở mức tốt nhất. –

+0

Một lý do để sử dụng 'this_thread :: sleep()' là vì nó cần thời gian trong bất kỳ đơn vị nào bạn thích: 'sleep (giây (10))', 'sleep (nano giây (10))', 'sleep (attoseconds (10))) '. Độ phân giải phần cứng không thay đổi, nhưng bất kỳ độ phân giải nào được cung cấp có thể được phơi sáng mà không cần phải tiếp tục giới thiệu các API ngủ mới ('sleep',' usleep', 'nanosleep', v.v.). – bames53

4

là có lý do nào đó không sử dụng cách tiếp cận Boost

Tôi cho rằng đây là loại rõ ràng, nhưng lý do duy nhất tôi có thể nghĩ là bạn cần tăng cường o biên dịch dự án của bạn.

+0

Tôi cho rằng tôi nên nói dự án đã sử dụng các thư viện tăng cường khác. Tuy nhiên, một câu trả lời hợp lệ cho câu hỏi chung. –

5

Làm thế nào vì ví dụ nanonsleep của bạn là sai.

#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; 
} 

Phải thừa nhận nếu bạn chỉ ngủ 1 micro giây thức dậy quá sớm không phải là vấn đề, nhưng trong trường hợp chung đây là cách duy nhất để hoàn thành công việc.

Và chỉ để làm bánh kem trong lợi thế của tăng, boost::this_thread::sleep() được triển khai bằng cách sử dụng nanosleep(). Họ chỉ chăm sóc tất cả các trường hợp góc điên rồ cho bạn.

+0

+1, tôi thấy rằng tăng 'sleep()' sẽ được thực hiện với 'nanosleep()', tốt để có xác nhận. –

+0

Bạn thấy giấc ngủ được thực hiện bằng nanosleep ở đâu? Trong thread.hpp tôi thấy: inline void sleep (xtime const & abs_time) {sleep (system_time (abs_time)); } – clemahieu

+0

@clemahieu: Đó không phải là lệnh gọi 'ngủ '(nếu không bạn sẽ bị giới hạn ở độ phân giải giây). Đó là một cuộc gọi đến một trong nhiều quá trình tăng cường 'boost :: this_thread :: sleep' khác, có định nghĩa mà bạn có thể tìm thấy trong' libs/thread/src/pthread/thread.cpp'. –

2

Đối với tôi, lý do chính để sử dụng biến thể tăng cường là nền tảng độc lập. Nếu bạn được yêu cầu biên dịch ứng dụng của bạn cho cả hai nền tảng posix và Windows, ví dụ, nền tảng ngủ không đủ.

Các vấn đề liên quan