2010-10-27 27 views
17

J'ai passé un certain temps dans le débogage d'un programme qui donne un défaut de segmentation. Le bug est assez indéterministe et intermittent, ce qui est ennuyeux. Je l'ai réduit à l'appel de Strtok. Je soupçonne que c'est l'appel de strtok pour séparer la chaîne dans deux threads différents qui provoque la faute de segmentation. Puis-je appeler strtok dans deux threads différents?sécurité de fil de fonction strtok

Merci.

+0

S'il vous plaît ne pas étiqueter une question C++ quand il s'agit réellement d'une question C. –

Répondre

35

strtok() n'est pas réentrant, donc il ne doit pas être utilisé à partir d'applications threadées, utilisez plutôt strtok_r().

+0

J'ai essayé d'utiliser C-dev pour créer un programme C, et strtok_r n'était pas disponible :(Je ne suis pas sûr de ce que utilise standard/version/compc devcpp –

+0

La version standard POSIX de strtok a un pointeur supplémentaire. l'état.Pour cette version est thread-safe tant que différentes marches utilisant des pointeurs différents. – Calmarius

6

strtok() n'est pas sûr pour le MT car il stocke globalement certaines variables intermédiaires et les réutilise à chaque appel (vous n'avez pas besoin de passer à nouveau la chaîne chaque fois que vous appelez strtok()). Vous pouvez jeter un oeil aux pages de manuel des méthodes que vous utilisez et il est toujours indiqué à la fin si c'est MT-safe ou non.

Lorsqu'une méthode n'est pas sûre pour le MT (multi-thread safe ou réentrant), vous devriez rechercher la même méthode avec le suffixe _r qui signifie reentrand. Dans votre exemple, strtok_r() comme suggéré dans l'autre réponse.