我将在多线程应用程序中持续拆分字符串,我已经读到
我应该考虑在调用
strtok
不适合这种情况,但为什么?我应该考虑在调用
strtok
的代码段周围使用信号量吗?strtok
不适合这种情况,但为什么?strtok
的代码段周围使用信号量吗?strtok
或strtok_r
。编写类似这些函数但更适合你要使用的方式的自定义函数非常简单,当然,调用方需要存储所有状态并传递指向状态的指针以实现线程安全/可重入性。strtok
时使用信号量(或其他锁定原语)的问题,如果你只是将它放在实际调用周围,那么这样做是没有帮助的。你必须在解析字符串的整个过程中持有锁,以保护strtok
的内部状态。我认为这就是许多人所谓的“以代码代替数据锁定”的情况,通常被认为是一件坏事。strtok_r
。strtok
会将其值存储在TLS(线程本地存储)中,因此在多个线程同时使用时应该没有问题。但是,你不能将对同一字符串的分词拆分到多个线程上进行。strtok
版本不符合规范。符合规范的程序可以在确保适当同步的情况下,在多个线程中分割对同一字符串的strtok
调用。如果状态在TLS中,这显然行不通。请就此提出缺陷报告,无论哪个实现采用了这种方法。 - R.. GitHub STOP HELPING ICE
strtok
的不可重入性而不是尝试调试由其引起的问题的建议。 - R.. GitHub STOP HELPING ICE