初始化pthread互斥锁

Sta*_*ked 21 c c++

根据文档,可以通过两种方式初始化互斥锁:

使用init函数:

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

使用初始化宏:

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

关于后者文件说:

在默认互斥锁属性适当的情况下,宏PTHREAD_MUTEX_INITIALIZER可用于初始化静态分配的互斥锁.通过调用pthread_mutex_init()并将参数attr指定为NULL,该效果应等效于动态初始化,但不执行错误检查.

这是否意味着它只能用于静态变量而不能用于局部变量?

C++特定

我想使用以下"工厂功能":

static pthread_mutex_t GetFastNativeMutex()
{
    static pthread_mutex_t result = PTHREAD_MUTEX_INITIALIZER;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

因为它允许我在C++初始化程序列表中初始化互斥锁,如下所示:

MyClass() : myMutex(GetFastNativeMutex()) {}
Run Code Online (Sandbox Code Playgroud)

这有效吗?(顺便说一句,实际上它很有效.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;
Run Code Online (Sandbox Code Playgroud)

但是,在查看预处理器输出(使用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}};
Run Code Online (Sandbox Code Playgroud)

事实证明,创建了三倍相同的互斥锁.我在这做错了什么?

Dav*_*men 24

Re"事实证明,相同的互斥锁创造了三倍.我在这里做错了什么?"

你在这里做错了什么.没有创建三次相同的互斥锁.看起来你正在将0x32AAABA7解释为一个地址.事实并非如此.它本质上是一个枚举值,但具有汉明码保护,以便(a)使其安全并且(b)使其模糊不清.这里有三个不同的互斥锁.


And*_*rei 9

Standard不允许按值复制互斥锁或按值返回互斥锁.请参阅http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_mutex_init.html,该段明确说明了这一点,并说"IEEE Std 1003.1-2001未定义此类型的赋值或相等[pthread_mutex_t]"

pthread_mutex,WIN32 CriticalSection的最近亲属绝对不可复制,不能按值返回.因此,无论如何,您的API将非常不便携.

我建议不要按值复制(返回)互斥锁,即使你可以测试它也可以.

请注意,初始化互斥锁与复制已初始化的互斥锁不同.