C 共享库局部变量是线程安全的吗?

C 共享库局部变量是线程安全的吗?,c,linux,multithreading,thread-safety,shared-libraries,C,Linux,Multithreading,Thread Safety,Shared Libraries,我正在开发一个多线程应用程序,该应用程序将访问共享库,现在我看到共享库不包含任何全局变量,那么这是否意味着库是线程安全的?比如说 我正在从多个线程调用函数func(),调用共享库,如: 线程1->func() 线程2->func() 线程N->func() func()的定义如下: void func(){ int var; func2(&var); } 在这种情况下,它是线程安全的吗?是的,相关代码将在每个线程的上下文中执行,并且本地自动变量通常存储在每个线程的堆栈

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

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

线程1->func()

线程2->func()

线程N->func()

func()的定义如下:

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

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

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

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

但是,出于以下几个原因,这不是一种保证:

  • 库也需要小心使用
    静态
    变量。如果将
    int-var
    替换为
    static int-var
    func
    将不再是线程安全的
  • 打电话给图书馆时要小心。如果代码中存在与您显示的相同的模式,即如果您的代码在线程之间共享一个局部变量,那么代码将不是线程安全的
  • 库可能使用非线程安全的函数,例如
    strtok
    。使用这些函数会使库不是线程安全的

如果您询问,每个线程的
var
是否独立,是的。它是一个自动变量。
func2
的其余部分是否“线程安全”取决于您。是的,我会处理它,我唯一关心的是共享库将加载到公共内存中,如果线程尝试访问它,它是否安全。谢谢你们的回复。你们不应该在普通的记忆中乱搞——只要坚持和malloc和朋友们在一起,你们就会被找到的。那么“偶然”访问另一个线程的堆栈就不会有问题了。