我在Web上看到的大多数示例都将pthread_mutex_t放在全局空间中的文件顶部,我想我在某处看过Linux互斥锁必须是全局的。这是真的吗?
编辑:
我有一些Win32多线程代码,我正在移植到Linux。对于windows代码,有几个封装函数封装了互斥锁创建和锁定/解锁等功能。我的理解是,通过Windows中的Create()
API调用之一创建的每个同步原语都会返回一个HANDLE,该HANDLE可以存储在实例字段中,然后再使用。在这种情况下,它在Lock()函数中使用,它是WaitForSingleObject()的包装。对于Linux,我可以简单地将互斥锁存储在实例字段中并在Lock()函数中调用pthread_mutex_lock()/pthread_cond_wait()
并期望与Windows上的行为相同吗?
Nv_Mutex::Nv_Mutex(Nv_XprocessID name)
{
#if defined(WIN32)
if((handle = ::CreateMutexA(0, false, name)) == NULL)
{
throw Nv_EXCEPTION(XCPT_ResourceAllocationFailure, GetLastError());
}
isCreator = !(::GetLastError() == ERROR_ALREADY_EXISTS);
#else
if (name == Nv_XprocessID_NULL) {
/*
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // Fast
pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; // Recursive
pthread_mutex_t errchkmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; // Errorcheck
*/
mutex = PTHREAD_MUTEX_INITIALIZER;
// attributes??
if (pthread_mutex_init(&mutex, NULL) != 0) {
throw Nv_EXCEPTION(XCPT_ResourceAllocationFailure, GetLastError());
}
}
else {
// insert code for named mutex (needed for shared mutex across processes) here.
}
//isCreator = !(GetLastError() == EBUSY);
#endif
}
bool
Nv_Mutex::Lock(const char *f, int l, Nv_uint32 timeout)
{
switch(WaitForSingleObject(handle, timeout))
{
case WAIT_OBJECT_0:
file = f;
line = l;
return true;
case WAIT_TIMEOUT:
return false;
}
throw Nv_EXCEPTION(XCPT_WaitFailed, GetLastError());
}
答案 0 :(得分:1)
不,他们可以确定范围。实际的互斥指针没什么特别的。
答案 1 :(得分:1)
你的要求有点不对劲。互斥锁不需要是全局的,但是,您无法静态初始化非静态互斥锁。但是,在调用pthread_mutex_init
之前,您不需要静态初始化互斥锁,因为它会初始化它。所以,不要使用静态初始值设定项,而是调用pthread_mutex_init
。
它实际上会起作用,但由于实施的细节,这是幸运的。请不要依赖实施细节。
静态初始化仅对静态ALLOCATED存储是合法的[。] ...尽管C语法允许在“自动”变量上使用静态初始化宏,但POSIX标准明确禁止这样做。这不正确,而且不便携。 - David Butenhof