确保在多线程环境中仅对堆栈分配的pthread_mutex_t对象进行一次初始化的建议/标准方法是什么?如何确保共享堆栈分配pthread_mutex_t的单个初始化? (C++)
的pthread_mutex_init()
手册页说:
试图初始化在 不确定的行为已初始化互斥结果。
我有一个.cpp
文件被编译到共享库。此文件的简化是:
#include <pthread.h>
static pthread_mutex_t g_mutex;
int initialize()
{
pthread_mutex_init(&g_mutex, NULL);
pthread_mutex_lock(&g_mutex);
// Do init stuff.
pthread_mutex_unlock(&g_mutex);
return 0;
}
initialize()
可以在多线程环境中调用。因此,如上所述,pthread_mutex_init()
可能会在同一个对象上被调用多次,这是未定义的行为。所以这需要线程安全......通过使用另一个互斥体。但是,那么谁是以线程安全的方式初始化这个互斥锁呢?
在全球范围内(即与pthread_mutex_t
对象声明相同的范围)调用pthread_mutex_init()
是否合法?是否被认为是这种情况的“正确”解决方案?
#include <pthread.h>
static pthread_mutex_t g_mutex;
static int g_res = pthread_mutex_init(&g_mutex, NULL);
int initialize()
{
// g_mutex already initialized (?) so no need to do so here.
pthread_mutex_lock(&g_mutex);
// Do init stuff.
pthread_mutex_unlock(&g_mutex);
return 0;
}
我已经试过:
我编译和运行第二个代码块,这两者的成功。
但是我还是想问的社区,因为我有点不清楚停靠全球范围内pthread_mutex_init()
功能的合法性,我想,以确保执行不只是出现的,因为不确定的工作行为。
我也读了关于'PTHREAD_MUTEX_INITIALIZER',但那么提示问题_什么,如果默认属性不会做?_。我也很好奇,会发生什么在C编译器中的“解决方案”代码?是一个编译或运行时错误吗? – StoneThrow
@StoneThrow,建议的解决方案将被符合C编译器拒绝 –
“但它在C++中没有问题”...所以我猜想在C++中,如果默认属性不行,那么静态声明一个'pthread_mutexattr_t'并将其作为参数传递给'pthread_mutex_init()'...的全局函数是可以接受的。我很好奇这种情况在C中如何解决。也许我会问一个单独的问题。 – StoneThrow