【问题标题】:strtok function thread safetystrtok 函数线程安全
【发布时间】:2010-10-27 08:04:00
【问题描述】:

我一直在调试一个导致分段错误的程序。该错误非常不确定且断断续续,这很烦人。我把它缩小到strtok()的调用。我怀疑是调用strtok() 在两个不同的线程中拆分字符串导致了分段错误。我可以在两个不同的线程中调用strtok() 吗?

谢谢。

【问题讨论】:

  • 当问题实际上是 C 问题时,请不要标记 C++。

标签: c linux thread-safety strtok


【解决方案1】:

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

【讨论】:

  • 我尝试使用 Dev-C++ 制作 C 程序,但 strtok_r 不可用 :( 我不确定 devcpp 使用什么标准/版本/编译器
  • POSIX 标准版本的 strtok 有一个额外的指针。它可以保持状态的地方。所以这个版本是线程安全的,只要不同的线程使用不同的指针。
【解决方案2】:

strtok() 不是 MT 安全的,因为它全局存储了一些中间变量并在每次调用时重用它们(请注意,每次调用 strtok() 时不必再次传递字符串)。 您可以查看您正在使用的方法的手册页,如果它是 MT 安全的,它总是会在最后指出。

当方法不是 MT 安全(多线程安全或可重入)时,您应该寻找后缀 _r 表示可重入的相同方法。在您的示例中,strtok_r() 如另一个答案中所建议的那样。

【讨论】:

    猜你喜欢
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多