2013-08-21 11 views
7

La pagina man di mktime non ha menzionato la sicurezza filo di mktime, ma ha fatto parlare di questo, che fanno sembrare come un filo pericoloso:È standard C mktime thread safe su linux?

Calling mktime() imposta anche il tzname variabile esterna con informazioni su il fuso orario attuale.

So su Linux mktime chiamate tzset per impostare tzname, che è un char * []:

extern char * tzname [2];

e tzset leggeranno la variabile di ambiente TZ e il file/etc/localtime. Quindi, a meno che mktime non usi un mutex per proteggere tutte queste operazioni, non riesco a vedere come può essere thread-safe.

+0

possibile duplicato di [funzione di tempo C multiple thread] (http://stackoverflow.com/questions/18348383/c-time-function-multiple-thread) –

+0

@ShafikYaghmour La domanda precedente e le sue risposte si concentrano su asctime' , 'ctime',' gmtime' e 'localtime' che restituiscono i puntatori ai dati statici e sono pertanto non sicuri dal punto di vista del design. Questa domanda riguarda specificamente 'mktime', la cui interfaccia non è thread-safe, ma potrebbe essere l'effetto collaterale ulteriormente imposto da POSIX. Quindi questo non è un duplicato della domanda precedente. – user4815162342

+0

è vero, penso che le prime due righe aggiunte siano un po 'fuorvianti, la precedente domanda non ha risposto a nulla riguardo a mktime. – swang

risposta

8

È vero che mktime ha un effetto collaterale, ma l'effetto collaterale dovrebbe essere innocuo nella maggior parte dei programmi.

Secondo POSIX, l'effetto collaterale sarà come se tzset è stato chiamato, che a sua volta semplicemente copia le informazioni fuso orario dalla variabile TZ ambiente alla tzname array di stringhe C. Se l'applicazione non cambia TZ, non avrai problemi con la chiamata mktime() contemporaneamente.

In aggiunta a questo, GNU libc tzsetdoes use a mutex per proteggere l'integrità di tzname. Questa è un'aggiunta di qualità di implementazione non garantita dallo standard.

+0

bene, ma sembra TZ può essere modificato da molte altre funzioni temporali, ad es. strftime, o chiamando direttamente tzset. Inoltre TZ di solito punta a un file che è collegato simbolicamente da/etc/localtime, che può essere modificato in qualsiasi momento? – swang

+0

Scusa non ho visto la tua modifica, questo ha più senso, l'intera chiamata tzset è protetta da un mutex, quindi qualsiasi funzione del tempo utilizzando le informazioni del fuso orario sarà sincronizzata al mutex, inclusi strptime e strftime. Questo garantisce la sicurezza del thread, ma suona molto inefficiente per me. – swang

+0

@swang 'tzset' ha un [percorso veloce] (http://sourceware.org/git/?p=glibc.git;a=blame;f=time/tzset.c; hb = 26b4d7667169f8db26fd8194b3c498ec58e50f90 # l173) che mette in guardia se il valore della variabile di ambiente 'TZ' non è cambiato, nonostante cambi in'/etc/localtime'. Per questo la sua efficienza dovrebbe essere ragionevole. – user4815162342