2011-12-05 19 views
8

Esiste un elenco definitivo di funzioni che sono thread-safe nell'implementazione della libreria standard C di Mac OS X?Filettatura di sicurezza della libreria standard C su OS X

C'è una buona risposta here per quanto riguarda glibc e f*() funzioni specificamente, ma non sono riusciti a trovare alcuna tale risorsa rispetto a OS X. C'è una cosa simile?

Ad esempio, sono strptime() e strftime() thread-safe? printf()? Questi sono alcuni che possono avere buffer interni che non vorrei rovinare. :)

+0

Come commento a margine (Dave e ruakh ti danno la risposta (s)) anche se alcuni le funzioni standard sono garantite per essere thread-safe, l'implementazione di ciò spesso comporta una penalizzazione ad alte prestazioni. Cose come 'printf' e.g sono notoriamente cattive dal momento che hanno la tendenza a serializzare il tuo codice. –

risposta

3

La specifica Single Unix fornisce a fairly short list of functions that are allowed to be non–thread-safe (eccetto che le funzioni nel "Legacy Feature Group" possono essere non thread-safe nonostante non siano elencate qui). L'elenco include strtok(), che Dave menziona nella sua risposta, ma fa non include strptime(), né strftime(), né printf().

This StackOverflow answer asserisce, in risposta a una domanda che è abbastanza simile a questa, che OS X supporta l'aspetto precedente delle specifiche, quindi penso che sia probabilmente la migliore lista da usare. (Probabilmente sarà anche interessato al resto di questa domanda, e nell'altra risposta ad esso, a proposito.)

2

Qualsiasi funzione che sembra avere un potere magico di memorizzazione, probabilmente non è thread-safe. Qualsiasi funzione che restituisce un puntatore che non è previsto per free() è molto spesso non thread-safe.

Molte delle funzioni di cui si deve veramente preoccupare restituiscono char* o struct foo*. Sebbene questa non sia una regola perfetta, questo è spesso indicativo di una funzione che ha una sorta di memoria statica e non è thread-safe.

strtok() è un semplice esempio di è ed è stato sostituito da strtok_r() che è thread-safe. Per molte funzioni non thread-safe, esiste uno function_r() (r per il rientro) che è.