Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Linux互斥体必须是全局的?_Android_Linux_Multithreading - Fatal编程技术网

Android Linux互斥体必须是全局的?

Android Linux互斥体必须是全局的?,android,linux,multithreading,Android,Linux,Multithreading,我在Web上看到的大多数示例都在全局空间的文件顶部有pthread_mutex_t,我想我在某个地方读到Linux互斥体必须是全局的。这是真的吗 编辑: 我有一些Win32多线程代码要移植到Linux上。对于windows代码,有几个包装函数可以封装互斥创建和锁定/解锁等内容。我的理解是,通过Windows中的一个Create()API调用创建的每个同步原语都会返回一个句柄,该句柄可以存储在实例字段中,然后在以后使用。在本例中,它用于Lock()函数,该函数是WaitForSingleObjec

我在Web上看到的大多数示例都在全局空间的文件顶部有pthread_mutex_t,我想我在某个地方读到Linux互斥体必须是全局的。这是真的吗

编辑: 我有一些Win32多线程代码要移植到Linux上。对于windows代码,有几个包装函数可以封装互斥创建和锁定/解锁等内容。我的理解是,通过Windows中的一个
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标准明确禁止这样做。这不正确,也不便于携带