C 在函数内安全初始化锁/互斥锁

C 在函数内安全初始化锁/互斥锁,c,pthreads,C,Pthreads,场景:我想在一些foo.h/foo.c模块中提供一个独立的foo。此函数应该能够以线程安全的方式执行 问题如何在函数中安全初始化互斥锁(或任何其他锁抽象)。我想我可以有这样的东西: foo(){ static pthread_mutex_t *lock=NULL; if (lock == NULL){ lock = init_lock(lock); } //acquire (lock) // foo ; //release (lock) }

场景:我想在一些foo.h/foo.c模块中提供一个独立的foo。此函数应该能够以线程安全的方式执行

问题如何在函数中安全初始化互斥锁(或任何其他锁抽象)。我想我可以有这样的东西:

foo(){
   static pthread_mutex_t *lock=NULL;
   if (lock == NULL){
     lock = init_lock(lock); 
   } 
   //acquire (lock)
   // foo ; 
   //release (lock)
}
但接下来我必须表演:

if (lock == NULL){
     lock = init_lock(lock); 
   } 

原子的,我不知道怎么做

你的想法太复杂了

static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
意味着做你想做的事


如果您只需要该函数中的锁,请将静态变量放在其中。如果在多个函数中需要它,请将其作为全局变量放在.c文件中。

为什么要定义指向互斥体的指针而不是带有适当初始值设定项的普通互斥体?因为我需要检查锁是否已初始化。我知道这不是最好的ideia,必须有一些共同的模式来实现这一点,但我找不到一个……如果使用一个带有适当初始值设定项的普通互斥体,你就不会这么做了。首先,这应该是
pthread\u mutex\u t lock=pthread\u mutex\u INIT第二,您使用的是什么C?因为我不知道C(至少到99年)支持线程安全的静态本地初始化。也许是的,我又在标准方向盘上睡着了。我知道C++直到C++才得到它。谢谢。请注意,如果您需要递归或错误检查互斥体,或优先级继承、健壮互斥体、进程共享互斥体或任何其他特殊属性,这将不起作用。相反,您可以使用
pthread\u一次
来初始化互斥锁。