2011-12-05 17 views
8

Czy istnieje pełna lista funkcji, które są bezpieczne dla wątków w implementacji biblioteki standardowej C w systemie Mac OS X?Bezpieczeństwo wątków biblioteki standardowej C na OS X

Istnieje dobra odpowiedź here w odniesieniu do funkcji glibc i f*() w szczególności, ale nie udało mi się znaleźć takiego zasobu w odniesieniu do OS X. Czy jest coś takiego? Na przykład: czy strptime() i strftime() są bezpieczne dla wątków? printf()? Są to niektóre, które mogą mieć wewnętrzne bufory, których nie chciałbym zepsuć. :)

+0

Jako uwaga dodatkowa (Dave i ruakh podają odpowiedź (e)), nawet jeśli niektóre Standardowe funkcje gwarantują bezpieczeństwo wątków, a ich wdrożenie często wiąże się z wysoką wydajnością. Rzeczy takie jak 'printf' np są notorycznie złe, ponieważ mają tendencję do serializowania kodu. –

Odpowiedz

3

Specyfikacja pojedynczego systemu Unix podaje a fairly short list of functions that are allowed to be non–thread-safe (z wyjątkiem tego, że funkcje w "grupie starszych funkcji" mogą być nieobsługiwane przez wątki, mimo że nie są tam wymienione). Lista zawiera: strtok(), którą Dave wspomina w swojej odpowiedzi, ale nie ani to strptime() ani strftime() ani printf().

This StackOverflow answer twierdzi, w odpowiedzi na pytanie, które jest dość podobne do tego, że OS X obsługuje powyższy aspekt specyfikacji, więc myślę, że jest to prawdopodobnie najlepsza lista do wykorzystania. (Prawdopodobnie będziesz także zainteresowany resztą tego pytania, a w drugiej odpowiedzi na to pytanie, nawiasem mówiąc.)

2

Każda funkcja, która wydaje się mieć magiczną moc pamiętania, prawdopodobnie nie jest bezpieczna dla wątków. Dowolna funkcja, która zwraca wskaźnik, który nie ma być free(), często nie jest bezpieczna dla wątków.

Wiele funkcji, które naprawdę musisz martwić się o zwrot char* lub struct foo*. Chociaż nie jest to idealna reguła, często wskazuje to na funkcję, która ma pewne statyczne miejsce przechowywania i nie jest bezpieczna dla wątków.

jest prostym przykładem is, i został zastąpiony przez strtok_r(), który jest bezpieczny dla wątków. W przypadku wielu funkcji, które nie są bezpieczne dla wątków, istnieje function_r() (r dla reentrant), który jest.

Powiązane problemy