8
votes

Multhreading et strutok

Je serai continuellement fractionnement des chaînes dans une application multithreadiée, j'ai lu que strtok ne convient pas à cela, mais pourquoi?

Devrais-je envisager d'utiliser un sémaphore autour de la partie de mon code qui appelle strtok ?


2 commentaires

Dupliquer: Stackoverflow.com/Questtions/4031075/...


S'il vous plaît ne fermez pas cela comme un duplicata. Les réponses sont liées mais ce n'est pas la même chose. Ici, op demande des conseils sur la manière de gérer la non-réentrée de strtok plutôt que d'essayer de déboguer un problème en raison de cela.


3 Réponses :


9
votes

Utilisez strtok_r () pour la sécurité du fil.


0 commentaires

4
votes

Vous devrez utiliser strtok_r .

Dans certaines implémentations non standard (plus en évidence Microsoft), Strtok stocke ses valeurs dans TLS (stockage de fil-local), il doit donc être correct à utiliser dans plusieurs threads en même temps. Cependant, vous ne pouvez pas diviser votre tokénisation pour une seule et même chaîne sur plusieurs threads.


1 commentaires

Une version de strtok qui stocke son état dans TLS est non conformaire. Un programme conforme peut, tant qu'il assure une synchronisation appropriée, des appels fractionnés vers strtok sur la même chaîne sur plusieurs threads. Si l'état est dans TLS, cela ne fonctionnera évidemment pas. Veuillez déposer des rapports de bogues pour la mise en œuvre qui la fait.



12
votes

Vous devriez envisager de ne pas utiliser strtok ou strtok_r du tout. Il est trivial d'écrire vos propres fonctions similaires à celles-ci mais mieux adaptées à la manière exacte que vous souhaitez les utiliser, et bien sûr que l'appelant stocker tout l'état et transmettez un pointeur à l'état pour la sécurité / la réentruisance.

Quant à votre question sur l'utilisation d'un sémaphore (ou d'une autre primitive de verrouillage) autour des appels vers Strtok , cela ne vous aidera pas si vous venez de le mettre autour de l'appel actuel. Vous devez tenir la serrure pendant tout le processus d'analyse de la chaîne pour protéger l'état interne de strtok . Je crois que c'est ce que beaucoup de gens se réfèrent à code de verrouillage au lieu de données et il est généralement considéré comme une mauvaise chose . .


0 commentaires