Je serai continuellement fractionnement des chaînes dans une application multithreadiée, j'ai lu que Devrais-je envisager d'utiliser un sémaphore autour de la partie de mon code qui appelle strtok code> ne convient pas à cela, mais pourquoi? p>
strtok code>? p>
3 Réponses :
Vous devrez utiliser Dans certaines implémentations non standard (plus en évidence Microsoft), strtok_r code>. p>
Strtok CODE> 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. P>
Une version de strtok code> 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 code> sur la même chaîne i> 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.
Vous devriez envisager de ne pas utiliser Quant à votre question sur l'utilisation d'un sémaphore (ou d'une autre primitive de verrouillage) autour des appels vers strtok code> ou strtok_r code> 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. p>
Strtok CODE>, 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 code>. Je crois que c'est ce que beaucoup de gens se réfèrent à code de verrouillage au lieu de données em> et il est généralement considéré comme une mauvaise chose em>. P>.
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 code> plutôt que d'essayer de déboguer un problème en raison de cela.