2010-10-27 18 views
17

He estado pasando un tiempo en la depuración de un programa que da error de segmentación. El error es bastante indeterminista e intermitente, lo cual es molesto. Lo reduje a la llamada de strtok. Sospecho que es la llamada de strtok para dividir cadena en dos subprocesos diferentes que causa la falla de segmentación. ¿Puedo llamar a strtok en dos hilos diferentes?strtok function thread safety

Gracias.

+0

Por favor, no etiquetes una pregunta C++ cuando en realidad es una pregunta en C. –

Respuesta

35

strtok() no es reentrante por lo que no debe utilizarse desde aplicaciones con rosca, use strtok_r() en su lugar.

+0

Intenté usar Dev-C++ para hacer un programa C, y strtok_r no estaba disponible :(No estoy seguro de qué estándar/versión/compilador devcpp usa –

+0

La versión estándar POSIX de strtok tiene un puntero adicional. el estado. Por lo tanto, esa versión es segura para subprocesos siempre que diferentes pisadas utilicen diferentes punteros. – Calmarius

6

strtok() no es seguro para MT porque almacena algunas variables intermedias globalmente y las reutiliza en cada llamada (no es necesario que vuelva a pasar la cadena cada vez que llame al strtok()). Puede echar un vistazo a las páginas man de los métodos que está utilizando y siempre se indica al final si es seguro para MT o no.

Cuando un método no es seguro para MT (seguro multi hilo o reentrante), debe buscar el mismo método con el sufijo _r que significa reentrada. En su ejemplo, strtok_r() como se sugiere en la otra respuesta.