2011-10-17 13 views
9

Quale delle due funzioni è meglioPerché clock_nanosleep è preferibile rispetto a nanosleep per creare tempi di sospensione in C?

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

O

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

Definire "buono". Portatile, efficiente, noto, facilmente comprensibile, preciso, cosa cosa cosa? – unwind

+1

Hai letto le pagine man? http://linux.die.net/man/3/clock_nanosleep –

+0

@SanJacinto nessuno legge le pagine man. È come se ti chiedessi "Hai letto i termini di servizio di Facebook" o un meccanico che ti chiedeva "Hai letto anche il manuale utente" quando non riesci a capire perché i tuoi raggi alti non funzioneranno = P – puk

risposta

14

I vantaggi di clock_nanosleep oltre nanosleep sono:

  1. È possibile specificare un tempo assoluto di sospensione fino a anziché un intervallo di sospensione. Questo fa la differenza per l'orologio in tempo reale (wall time), che può essere resettato dall'amministratore o ntpd, ecc. Con nanosleep e precalcolando l'intervallo per dormire per raggiungere un dato tempo assoluto, non riuscirai a svegliare se l'orologio è ripristina e il tempo desiderato arriva "presto". Inoltre, c'è una condizione di gara con la pianificazione usando i tempi di intervallo: se calcoli l'intervallo che vuoi addormentare, ma ti anticipi prima di chiamare nanosleep e non riesci più a programmare per un po ', dormirai di nuovo troppo a lungo.
  2. È possibile dormire su timer diversi dall'orologio in tempo reale. Il più utile di solito è il clock monotono (che non può essere resettato e aumenta monotonicamente con la progressione del tempo reale), ma ci sono anche altre interessanti applicazioni come avere un thread in un processo multithreading sul clock della CPU del processo (quindi si risveglia dopo che il processo ha utilizzato una determinata quantità di tempo CPU).
+0

Volevo semplicemente aggiungere un commento per evitare confusione ... nanosleep() in Linux utilizza l'orologio CLOCK_MONOTONIC. Quindi se vuoi usare un orologio diverso da CLOCK_MONOTONIC in Linux, è allora che hai bisogno di clock_nanosleep(). –

7

Sul mio sistema, man 2 clock_nanosleep spiega le differenze tra le due funzioni così:

 
    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

Grazie .. Sto usando la funzione di lib di sonno standard di precisione posix per dormire, ma sembra che stia tornando troppo in fretta. Si prega di esaminare questo codice e fornire i dettagli di un modo in cui la funzione potrebbe essere riparata per il corretto sonno del tempo necessario. – payyans4u

Problemi correlati