Android Linux互斥体必须是全局的?
我在Web上看到的大多数示例都在全局空间的文件顶部有pthread_mutex_t,我想我在某个地方读到Linux互斥体必须是全局的。这是真的吗 编辑: 我有一些Win32多线程代码要移植到Linux上。对于windows代码,有几个包装函数可以封装互斥创建和锁定/解锁等内容。我的理解是,通过Windows中的一个Android Linux互斥体必须是全局的?,android,linux,multithreading,Android,Linux,Multithreading,我在Web上看到的大多数示例都在全局空间的文件顶部有pthread_mutex_t,我想我在某个地方读到Linux互斥体必须是全局的。这是真的吗 编辑: 我有一些Win32多线程代码要移植到Linux上。对于windows代码,有几个包装函数可以封装互斥创建和锁定/解锁等内容。我的理解是,通过Windows中的一个Create()API调用创建的每个同步原语都会返回一个句柄,该句柄可以存储在实例字段中,然后在以后使用。在本例中,它用于Lock()函数,该函数是WaitForSingleObjec
Create()
API调用创建的每个同步原语都会返回一个句柄,该句柄可以存储在实例字段中,然后在以后使用。在本例中,它用于Lock()函数,该函数是WaitForSingleObject()的包装器。对于Linux,我是否可以简单地将互斥锁存储在一个实例字段中,并在lock()函数中调用pthread\u mutex\u lock()/pthread\u cond\u 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());
}
不,它们可以确定范围。实际的互斥指针没有什么特别之处。您的要求有点错误。互斥体不需要是全局的,但是,不能静态初始化非静态互斥体。但是,在对互斥体调用
pthread\u mutex\u init
之前,不需要静态初始化互斥体,因为这样会初始化它。所以不要使用静态初始值设定项,而是调用pthread\u mutex\u init
它实际上会工作,但由于实现的细节,这是幸运的。请不要依赖于实施细节
静态初始化仅对静态分配的存储[]合法。。。尽管C语法允许在“自动”变量上使用静态初始化宏,但POSIX标准明确禁止这样做。这不正确,也不便于携带