2011-10-17 27 views
9

Mà một trong hai chức năng là tốt hơnTại sao clock_nanosleep được ưu tiên hơn nanosleep để tạo thời gian ngủ trong C?

#include <time.h> 
int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); 

HOẶC

#include <time.h> 
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); 
+3

Xác định "tốt". Xách tay, hiệu quả, nổi tiếng, dễ hiểu, chính xác, cái gì là gì? – unwind

+1

Bạn đã đọc các trang của người đàn ông chưa? http://linux.die.net/man/3/clock_nanosleep –

+0

@SanJacinto không ai đọc trang người đàn ông. Nó giống như tôi hỏi bạn "Bạn đã đọc các điều khoản dịch vụ của Facebook" hay một thợ máy hỏi bạn "Bạn thậm chí đã đọc hướng dẫn sử dụng" chưa, bạn không thể hiểu tại sao dầm cao của bạn sẽ không hoạt động = P – puk

Trả lời

14

Những lợi thế của clock_nanosleep trên nanosleep là:

  1. Bạn có thể chỉ định thời gian tuyệt đối để ngủ cho đến thay vì khoảng thời gian để ngủ. Điều này tạo sự khác biệt cho đồng hồ thời gian thực (thời gian tường), có thể được thiết lập lại bởi người quản trị hoặc ntpd, v.v. Với nanosleep và tính toán khoảng thời gian ngủ để đạt được thời gian tuyệt đối nhất định, bạn sẽ không đánh thức được nếu đồng hồ thiết lập lại và thời gian mong muốn đến "sớm". Ngoài ra, có một điều kiện chạy đua với lịch trình sử dụng khoảng thời gian: Nếu bạn tính toán khoảng thời gian bạn muốn ngủ, nhưng bạn được ưu tiên trước khi gọi số nanosleep và không được lên lịch lại trong một thời gian, bạn sẽ ngủ lại quá lâu.
  2. Bạn có thể ngủ trên giờ ngoài giờ thực tế. Hữu ích nhất thường là đồng hồ đơn điệu (không thể reset và tăng monotonically với sự tiến triển của thời gian thực tế), nhưng cũng có những ứng dụng thú vị khác như có một luồng trong quá trình ngủ nhiều luồng trên đồng hồ thời gian cpu của quá trình (vì vậy nó thức dậy sau khi quá trình đã sử dụng một lượng thời gian cpu nhất định).
+0

Chỉ muốn thêm nhận xét để tránh nhầm lẫn ... nanosleep() trong Linux sử dụng đồng hồ CLOCK_MONOTONIC. Vì vậy, nếu bạn muốn sử dụng một đồng hồ khác với CLOCK_MONOTONIC trong Linux, đó là khi bạn cần clock_nanosleep(). –

7

Trên hệ thống của tôi, man 2 clock_nanosleep giải thích sự khác biệt giữa hai chức năng như sau:

 
    Like nanosleep(2), clock_nanosleep() allows the caller to sleep for an 
    interval specified with nanosecond precision. It differs in allowing 
    the caller to select the clock against which the sleep interval is to 
    be measured, and in allowing the sleep interval to be specified as 
    either an absolute or a relative value. 

    The clock_id argument [...] can have one of the following values: 

    CLOCK_REALTIME A settable system-wide real-time clock. 

    CLOCK_MONOTONIC A non-settable, monotonically increasing clock that 
        measures time since some unspecified point in the past 
        that does not change after system startup. 

    CLOCK_PROCESS_CPUTIME_ID 
        A settable per-process clock that measures CPU time 
        consumed by all threads in the process. 

+0

Cảm ơn .. Tôi đang sử dụng chức năng ngủ chuẩn chính xác của posix để ngủ, nhưng nó dường như quay trở lại quá nhanh. Vui lòng kiểm tra mã này và cung cấp chi tiết về cách để sửa chữa chức năng để ngủ chính xác lượng thời gian chính xác. – payyans4u

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