2010-11-30 13 views
8

Voy a estar continuamente dividiendo cadenas en una aplicación multiproceso, he leído que strtok no es adecuado para esto, pero ¿por qué?multiprocesamiento y strtok

¿Debo considerar usar un semáforo alrededor de la parte de mi código que llama al strtok?

+0

duplicado: http://stackoverflow.com/questions/4031075/strtok-function-thread-safety – Necrolis

+2

No lo cierre como un duplicado. Las respuestas están relacionadas, pero no es lo mismo. Aquí, OP está pidiendo consejos sobre cómo manejar la no reentrada de 'strtok' en lugar de intentar depurar un problema debido a ello. –

Respuesta

9

Debería considerar no usar strtok o strtok_r en absoluto. Es trivial escribir sus propias funciones similares a estas, pero mejor adaptadas a la forma exacta en que desea usarlas, y por supuesto hacer que la persona que llama almacene todo el estado y pase un puntero al estado de seguridad/reentrada de hilos.

En cuanto a su pregunta sobre el uso de un semáforo (u otra primitiva de bloqueo) alrededor de las llamadas al strtok, eso no ayudará si solo lo coloca alrededor de la llamada real. Tendría que mantener el bloqueo durante todo el proceso de análisis de la cadena para proteger el estado interno de strtok. Creo que esto es lo que mucha gente llama código de bloqueo en lugar de los datos y generalmente se considera Una mala cosa.

3

Deberás usar strtok_r.

En algunas implementaciones no estándar (principalmente las de Microsoft), strtok almacena sus valores en TLS (almacenamiento local de subprocesos), por lo que debería estar bien utilizarlos en varios subprocesos al mismo tiempo. Sin embargo, no puede dividir su tokenización para una cadena y la misma a través de varios hilos.

+2

Una versión de 'strtok' que almacena su estado en TLS no cumple. Un programa conforme puede, en tanto garantice una sincronización adecuada, dividir llamadas a 'strtok' en la * misma cadena * a través de múltiples hilos. Si el estado está en TLS, obviamente esto no funcionará. Por favor, presente informes de errores para la implementación que lo haga. –

+0

Gracias R. También actualizaré mi respuesta. – EboMike