全局/本地/静态互斥锁的区别?

Sal*_*din 5 c multithreading mutex

互斥锁用于防止两个或多个线程同时访问同一个资源(文件、变量等)。这可以防止发生竞争条件。

每个线程都有自己的堆栈。这意味着当一个线程调用一个函数时,该线程将拥有该函数中定义的局部变量的唯一副本。但是如果将局部变量定义为static,则只会创建该变量的一个副本,并且所有线程都将访问该副本。

  • 这是否意味着本地static互斥锁没有用?

  • 一个可以static本地互斥是有用的?也许是为了保护static 局部变量?

  • 定义全局互斥锁static有何不同?

int*_*jay 6

非静态局部互斥体仍然有用:如果您有一个创建其他线程并等待它们完成的主线程,则互斥体可以是主线程中的局部变量,并且它将传递指向该互斥体的指针到其他线程。仅当保证主线程比其他线程寿命更长时,此方法才有效。

如果互斥变量被声明为static线程函数内部,则它将在使用该函数的不同线程之间共享,并且它们可以使用它进行同步。这是因为static变量与全局变量具有相同的生命周期(并且只有一个唯一的副本)。但是,只有当您的线程库不需要函数调用来初始化互斥体时,这才有效,因为没有一个好的地方可以进行初始化。

另一种选择是动态分配互斥锁,或者更常见的是,将其作为动态分配结构的成员。然后,您可以将指向互斥锁(或包含结构)的指针传递给所有需要它的线程。

至于你的最后一个问题:将全局变量定义为static意味着它仅在当前翻译单元中可见。它不会影响其生命周期,因此对于这一用例,其工作方式与非静态全局变量类似(只要您只需要在一个 .c 文件中访问它)。