根据文档,mutex可以通过两种方式初始化:
使用init函数:
pthread_mutex_t theMutex;
pthread_mutex_init(&theMutex, NULL);
使用初始化宏:
pthread_mutex_t result = PTHREAD_MUTEX_INITIALIZER;
关于后者,文档中提到:
在适用默认互斥属性的情况下,宏PTHREAD_MUTEX_INITIALIZER可以用于初始化静态分配的互斥锁。效果应等同于通过调用pthread_mutex_init()函数并将参数attr指定为NULL进行动态初始化,但不执行任何错误检查。
这是否意味着它只能用于静态变量而不能用于局部变量?
C++ 特定
我想要使用以下“工厂函数”:
static pthread_mutex_t GetFastNativeMutex()
{
static pthread_mutex_t result = PTHREAD_MUTEX_INITIALIZER;
return result;
}
因为这会使我能够在C++初始化列表中初始化互斥锁,如下所示:
MyClass() : myMutex(GetFastNativeMutex()) {}
这是有效的吗?(顺便说一下,在实践中它起作用。Valgrind也没有投诉。)
更新
如果我正确理解了文档,那么这应该没问题:
#include <pthread.h>
static pthread_mutex_t m0 = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t m2 = PTHREAD_MUTEX_INITIALIZER;
然而,当查看预处理器输出时(使用gcc -E main.cpp
),我看到了以下内容:
static pthread_mutex_t m0 = {0x32AAABA7, {0}};
static pthread_mutex_t m1 = {0x32AAABA7, {0}};
static pthread_mutex_t m2 = {0x32AAABA7, {0}};
事实证明创建了三次同样的互斥锁。我在这里做错了什么?