多线程和strtok

10
我将在多线程应用程序中持续拆分字符串,我已经读到strtok不适合这种情况,但为什么?
我应该考虑在调用strtok的代码段周围使用信号量吗?

请问 strtok 函数是否线程安全? - Necrolis
3
请不要将此标记为重复。答案相关但并非完全相同。在这里,OP正在寻求如何处理strtok的不可重入性而不是尝试调试由其引起的问题的建议。 - R.. GitHub STOP HELPING ICE
3个回答

14
你应该考虑不使用strtokstrtok_r。编写类似这些函数但更适合你要使用的方式的自定义函数非常简单,当然,调用方需要存储所有状态并传递指向状态的指针以实现线程安全/可重入性。
至于你关于在调用strtok时使用信号量(或其他锁定原语)的问题,如果你只是将它放在实际调用周围,那么这样做是没有帮助的。你必须在解析字符串的整个过程中持有锁,以保护strtok的内部状态。我认为这就是许多人所谓的“以代码代替数据锁定”的情况,通常被认为是一件坏事。

9

4
你需要使用strtok_r
在一些非标准的实现中(最著名的是Microsoft的实现),strtok会将其值存储在TLS(线程本地存储)中,因此在多个线程同时使用时应该没有问题。但是,你不能将对同一字符串的分词拆分到多个线程上进行。

4
使用TLS存储状态的strtok版本不符合规范。符合规范的程序可以在确保适当同步的情况下,在多个线程中分割对同一字符串strtok调用。如果状态在TLS中,这显然行不通。请就此提出缺陷报告,无论哪个实现采用了这种方法。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接