PTHREAD_MUTEX_INITIALIZER与pthread_mutex_init(&mutex,param)


89

之间有什么区别

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

要么

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

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

注意:我的问题主要涉及非常小的程序,在这些程序中,我最多要做的是将多个客户端连接到服务器,并使用辅助线程解决其查询。

Answers:


72

在POSIX标准的较早版本中,仅保证带有初始化程序的第一种方法可用于静态分配的变量,而不能保证变量是auto在函数主体中定义的变量时。尽管我从未见过这样的平台,即使对于auto变量,也不允许这样做,并且此限制已在最新版本的POSIX标准中删除。

static如果可能的话,该变体确实是更可取的,因为它使编写引导程序代码更加容易。只要在运行时输入使用这种互斥锁的代码,就可以确保互斥锁已初始化。这是多线程上下文中的宝贵信息。

当您需要互斥锁的特殊属性(例如递归的)或在进程之间(不仅在线程之间)可共享时,最好使用init函数的方法。


8

您可以通过动态初始化来设置互斥锁的更多属性,并且仅当在运行时添加一堆互斥锁时才可以使用动态方法。

如果静态方法符合您的需求,则没有任何问题。


另外,如果在运行时添加一堆互斥锁,则只能使用动态方法。 ”那么,这意味着什么呢?一个小例子,如果不容易解释?
Kalec 2013年

1
@Kalec:如果您的互斥锁是由malloc()(或属于分配的对象)分配的。
Michael Burr 2013年

3
@Kalec如果互斥变量“ lock”是结构的一部分,则我们不能采用第一种方法。我们必须使用pthread_init()。
pankaj kushwaha 2015年

7

我想引用这本书的内容

对于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只是使用默认值。两种方法都可以,但是我们通常使用动态(后期)方法。


4

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.