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