2011-12-05 13 views
8

¿Hay una lista definitiva de funciones que son seguras para subprocesos en la implementación Mac OS X de la biblioteca estándar de C?Seguridad de subprocesos de la biblioteca estándar de C en OS X

Hay una buena respuesta here con respecto a las funciones glibc y f*() específicamente, pero no he podido encontrar ningún recurso con respecto a OS X. ¿Existe tal cosa?

Por ejemplo, son strptime() y strftime() thread-safe? printf()? Estos son algunos que pueden tener almacenamientos intermedios internos que no quisiera estropear. :)

+0

Como observación adicional (Dave y ruakh le dan la (s) respuesta (s)) aunque algunas Se garantiza que las funciones estándar son seguras para hilos, la implementación de eso a menudo viene con una penalización de alto rendimiento. Cosas como 'printf' e.g son notoriamente malas ya que tienen la tendencia a serializar su código. –

Respuesta

3

La especificación Unix Unix da a fairly short list of functions that are allowed to be non–thread-safe (excepto que las funciones en el "Grupo de funciones heredado" pueden no ser resistentes a subprocesos a pesar de no estar allí). La lista incluye strtok(), que Dave menciona en su respuesta, pero no incluye strptime(), ni strftime(), ni printf().

This StackOverflow answer afirma, en respuesta a una pregunta que es bastante similar a esta, que OS X admite el aspecto anterior de la especificación, por lo que creo que es probablemente la mejor lista para usar. (Por cierto, también estará interesado en el resto de esa pregunta, y en la otra respuesta, por cierto.)

2

Cualquier función que parezca tener algún poder de memoria mágica, es probable que no sea segura para subprocesos. Cualquier función que devuelve un puntero al que no se espera que free() con frecuencia no sea seguro para subprocesos.

Muchas de las funciones que realmente tiene que preocuparse vuelven char*, o struct foo*. Aunque esta no es una regla perfecta, esto es a menudo indicativo de una función que tiene algún tipo de almacenamiento estático y no es segura para subprocesos.

strtok() es un ejemplo simple de es, y ha sido sucedido por strtok_r() que es seguro para subprocesos. Para muchas funciones que no son seguras para subprocesos, existe un function_r() (r para reentrada) que es.