【问题标题】:Is shared library local variable thread safe?共享库局部变量线程安全吗?
【发布时间】:2014-08-26 09:30:45
【问题描述】:

我正在开发一个多线程应用程序,该应用程序将访问共享库,现在我看到共享库不包含任何全局变量,这是否意味着该库是线程安全的?例如。

我正在从各个线程调用函数func() 到一个共享库,例如:

线程 1 -> func()

线程 2 -> func()

...

线程 N ->func()

而func()的定义如下,

void func(){
    int var;
    func2(&var);
}

在这种情况下,它是线程安全的吗?

【问题讨论】:

  • 如果你问var 是否会独立于每个线程,是的。它是一个自动变量。 func2 的其余部分是否“线程安全”取决于您。

标签: c linux multithreading thread-safety shared-libraries


【解决方案1】:

您展示的用法是线程安全的,因为每个线程对func 的调用将拥有自己的变量var 的副本。

但这不是保证,但有几个原因:

  • 库也需要注意static 变量的使用。如果将int var 替换为static int varfunc 将不再是线程安全的
  • 调用库时需要小心。如果您的代码中存在与您显示的相同模式,即如果您的代码在线程之间共享一个局部变量,则该代码将不是线程安全的。
  • 库可能使用非线程安全的函数,例如strtok。使用这些函数会使您的库不是线程安全的。

【讨论】:

  • 是的,会处理它,我唯一担心的是共享库将被加载到公共内存中,如果线程试图访问它,它是否安全。感谢您的回复。
  • 你不应该乱用共同的记忆——只要坚持使用 malloc 和朋友,你就会被发现。那么“意外”访问另一个线程的堆栈应该没有问题。
【解决方案2】:

是的,有问题的代码将在每个线程的上下文中执行,并且本地自动变量通常会存储在每个线程的堆栈中。

【讨论】:

    猜你喜欢
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2017-03-07
    • 2015-07-07
    • 1970-01-01
    相关资源
    最近更新 更多