根据文档,可以通过两种方式初始化互斥锁:
使用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,该效果应等效于动态初始化,但不执行错误检查.
这是否意味着它只能用于静态变量而不能用于局部变量?
我想使用以下"工厂功能":
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)使其模糊不清.这里有三个不同的互斥锁.
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将非常不便携.
我建议不要按值复制(返回)互斥锁,即使你可以测试它也可以.
请注意,初始化互斥锁与复制已初始化的互斥锁不同.
| 归档时间: |
|
| 查看次数: |
34289 次 |
| 最近记录: |