PTHREAD_MUTEX_INITIALIZER与pthread_mutex_init(&mutex,param)

Kal*_*lec 82 c ubuntu mutex pthreads

两者之间有什么区别吗?

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
Run Code Online (Sandbox Code Playgroud)

要么

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);
Run Code Online (Sandbox Code Playgroud)

如果我只使用第一种方法,我是否足够安全?

注意:我的问题主要是指非常小的程序,我最多会将几个客户端连接到服务器并使用工作线程解决它们的查询.

Jen*_*edt 69

对于旧版本的POSIX标准,第一个带有初始化程序的方法只能保证使用静态分配的变量,而不是当变量是auto在函数体中定义的变量时.虽然我从未见过这样的平台,即使对于auto变量也不允许这样做,并且在最新版本的POSIX标准中已经删除了这一限制.

static变种是,如果你可就真是更好的,因为它允许写的引导代码要容易得多.无论何时在运行时输入使用此类互斥锁的代码,都可以确保互斥锁已初始化.这是多线程环境中的宝贵信息.

当您需要互斥锁的特殊属性时,使用init函数的方法更可取,例如递归,例如在进程之间共享,而不仅仅是在线程之间共享.


Joe*_*Joe 7

您可以使用动态初始化设置互斥锁的更多属性,如果在运行时添加一堆互斥锁,则只能使用动态方法.

如果符合您的需求,那么静态方法没有任何问题.

  • @Kalec如果互斥变量"lock"是结构的一部分,那么我们就不能遵循第一种方法.我们必须使用pthread_init(). (2认同)

小智 5

在默认互斥体属性合适的情况下,宏 PTHREAD_MUTEX_INITIALIZER 可用于初始化互斥体。

如果要为互斥锁指定属性,请使用动态初始化........

除了不执行错误检查外,效果应等同于通过调用 pthread_mutex_init() 并将参数 attr 指定为 NULL 进行动态初始化。


小智 5

我想引用这本书的内容

对于POSIX线程,有两种初始化锁的方法。一种方法是使用PTHREAD_MUTEX_INITIALIZER,如下所示: pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

这样做会将锁设置为默认值,从而使锁可用。动态的方式(即在运行时)是通过pthread_mutex_init()如下方式进行调用: int rc = pthread_mutex_init(&lock, NULL); assert(rc == 0); // always check success!

该例程的第一个参数是锁本身的地址,而第二个参数是可选的属性集。自己了解更多关于属性的信息;传递NULL只是使用默认值。两种方法都可以,但是我们通常使用动态(后期)方法。