101

有没有区别

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

或者

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

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

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

4

4 回答 4

81

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

static如果可以的话,该变体确实更可取,因为它可以更轻松地编写引导代码。每当您在运行时输入使用这种互斥锁的代码时,您都可以确保互斥锁已被初始化。这是多线程上下文中的宝贵信息。

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

于 2013-01-14T14:44:02.377 回答
13

我想从这本书中引用这个:

对于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 只是使用默认值。无论哪种方式都有效,但我们通常使用动态(后者)方法。

于 2018-04-08T19:35:24.933 回答
8

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

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

于 2013-01-14T14:16:37.080 回答
6

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

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

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

于 2013-11-29T06:29:46.763 回答