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

互斥锁用于防止两个或多个线程同时访问同一资源(文件,变量,..)。这样可以防止出现竞争情况。

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

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

  • static本地互斥体有用吗?也许是为了保护static 局部变量?

  • 将{strong> global 互斥体定义为static有何不同?

iCMS 回答:全局/本地/静态互斥锁之间的区别?

非静态本地互斥锁仍然有用:如果您有一个创建其他线程并等待它们完成的主线程,则该互斥锁可以是主线程中的局部变量,它将传递一个指针。那个互斥锁到其他线程。只有在确保主线程的寿命超过其他线程的情况下,此方法才有效。

如果互斥变量在线程函数中声明为static,它将在使用该函数的不同线程之间共享,并且他们可以将其用于同步化。这是因为static变量与全局变量具有相同的生存期(并且只有一个唯一副本)。但是,这仅在您的线程库不需要函数调用来初始化互斥锁的情况下有效,因为那里没有从那里进行初始化的好地方。

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

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

,

线程回调函数的本地无用-在多个函数之间不共享的互斥体没有多大意义。但是,您可以将其设置为本地static,以减少作用域/全局名称空间的混乱,然后通过指针在函数之间共享它。例如,让主线程创建它,然后在创建过程中将其传递给不同的线程。这通常是最有意义的-让一个线程负责创建和清除项目中的所有线程和互斥锁等。

一个经典的错误是让一个线程通过将具有自动存储(保存在堆栈中)的局部变量传递给线程来创建资源,然后该线程超出范围,并且变量变为无效。因此,习惯对这些变量使用static或动态内存分配,以使它们在程序的整个执行过程中持续存在。

“全局”一词令人困惑且定义不清。通常,它对整个项目意味着全局。作为任何函数外部声明的变量具有文件作用域,但此类变量可能具有外部或内部链接。外部含义为“全局”。但是,如果您声明文件范围变量static,则它将获得内部链接,并且仅对声明它的.c文件可见。这是一件好事,因为它可以缩小范围并防止使用全局变量对意大利面条进行编程。

, C 中的

静态表示仅在该文件中可见。因此,如果所有使用静态互斥锁的功能都位于同一文件中,则它们将共享同一互斥锁。如果互斥锁是从多个文件中的函数访问的,则该互斥锁必须为全局。通常,您有一个全局状态变量,并与它关联的全局互斥锁。

for case in `cat ./list.txt`; 
do
# open template_script.sh
# use somehow the line from template_script.sh (maybe substitute CASE=$case)
# save template_script with a new name script_$case
done

每个功能都没有互斥锁。

本文链接:https://www.f2er.com/1963262.html

大家都在问