strtok函数的线程安全性

20

我花了一些时间来调试一个出现分段错误的程序。这个缺陷相当不确定和间歇性,非常令人烦恼。我将其缩小到调用 strtok()。我怀疑在两个不同的线程中调用 strtok() 来拆分字符串会导致分段错误。我能在两个不同的线程中调用 strtok() 吗?

谢谢。


当一个问题实际上是一个C语言问题时,请不要标记为C++。 - Björn Pollex
2个回答

39

strtok()不可重入,因此不应在线程应用程序中使用,应改为使用strtok_r()


我尝试使用Dev-C++制作C程序,但strtok_r不可用:( 我不确定devcpp使用哪个标准/版本/编译器。 - Doug Molineux
POSIX标准版本的strtok有一个额外的指针,可以保持状态。只要不同的线程使用不同的指针,那么该版本就是线程安全的。 - Calmarius

8

strtok()不是MT安全的,因为它将一些中间变量全局存储并在每个调用时重复使用它们(看到你不必每次调用strtok()时再传递字符串)。 您可以查看您正在使用的方法的手册,在结尾处始终指示它是否是MT安全的。

当方法不是MT安全(多线程安全或可重入)时,您应该寻找相同后缀名为_r的方法,意思是可重入。在您的示例中,就像其他答案建议的那样,您可以使用strtok_r()


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