我花了一些时间来调试一个给出分段错误的程序。这个bug是非常不确定和间歇性的,这很烦人。我把它缩小到调用strtok()
。我怀疑调用strtok()
是在两个不同的线程中分割字符串导致分段错误。我可以在两个不同的主题中调用strtok()
吗?
感谢。
答案 0 :(得分:38)
strtok()
不可重入,因此不应在线程应用程序中使用,而是使用strtok_r()
。
答案 1 :(得分:6)
strtok()
不是MT安全的,因为它全局存储一些中间变量并在每次调用时重用它们(请参阅每次调用strtok()
时不必再次传递字符串)。
您可以查看正在使用的方法的手册页,如果它是MT安全的,它总是在末尾显示。
当一个方法不是MT安全的(多线程安全或可重入)时,你应该寻找带有后缀_r的相同方法,意思是重入。在您的示例中,strtok_r()
按照其他答案的建议。