2015-09-28 5 views
6

Sembra come po 'una domanda stupida, ma mi ha fatto pensare ...La funzione C time time() è sicura anche se è fornito un parametro NULL?

Secondo here, time è necessario per essere thread-safe su un sistema compatibile, giusto? Questo requisito vale indipendentemente dai parametri della funzione. Alcune funzioni sono elencate come non necessarie per essere thread-safe se fornito un argomento NULL e time non è incluso.

Quindi sembra che qualsiasi sistema sufficientemente compatibile con lo standard POSIX debba avere un'implementazione thread-safe di time.

Tuttavia, un sistema POSIX potrebbe scegliere di implementare time_t in una questione che lo rende effettivamente un puntatore ed essere ancora conforme? Quindi, se viene fornito un parametro NULL per archiviare il risultato, non tutte le scommesse sulla sicurezza del thread dovrebbero essere disattivate in quanto probabilmente restituirebbe un puntatore ad alcuni archivi statici? O c'è qualche requisito o convenzione per time_t che mi manca in questo aspetto?

Come farei meglio a verificare che time sia thread-safe su alcune piattaforme UNIX? In particolare, AIX, HP-UX, Linux e Solaris. Passare attraverso il disassemblaggio in un debugger potrebbe funzionare, ma le implementazioni potrebbero cambiare.

+6

http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/types.h.html: time_t e clock_t sono tipi interi o reale galleggianti. Assegnare loro dovrebbe essere thread-safe. – marcolz

+0

'time' è una funzione abbastanza stupida così com'è. Non possiamo rompere la sua firma per ragioni di compatibilità, ma c'erano pochi motivi per renderla ancora più silente e consentire implementazioni non sicure. – MSalters

+0

@marcolz Grazie. Non sono sicuro di quanto mi sia mancato. – Kizaru

risposta

4

Sì, è sicuro da thread.

time_t time(NULL); 

Se implementato un valore interno, in corrispondenza del punto è tornato, sarebbe sempre necessario copiare dal valore interno al valore di ritorno (registrarsi?). Quella copia lo renderebbe thread-safe come si adatterebbe in tutti i moderni processori single-copy.

mov eax, static_internal_value 
return 

Immaginate che non era il caso, e 2 fili è venuto in Avrebbero entrambi ricopiare lo stesso valore -. Ancora una volta, non vedo come questo potrebbe non essere corretto.

thread 1         thread 2 
              mov eax, static_internal_value 
mov eax, static_internal_value 
return 
              return 
+0

Alcune cose. Non ero a conoscenza del fatto che 'time_t' fosse un intero o un tipo a virgola mobile. Questo butta fuori la mia ipotetica situazione di puntatore. In secondo luogo, il tuo post sta assumendo un doppio deposito atomico. Che di solito è vero, ma l'architettura x86 non è l'arco delle piattaforme che ho elencato. Anche con l'obbligo per 'time_t' di essere un numero intero o un punto mobile, un'implementazione conforme potrebbe avere un' time_t' di 8 byte che potrebbe non avere il carico/deposito atomico su alcune piattaforme. Le specifiche POSIX dicono che 'time' deve essere thread-safe, e così è. – Kizaru