android - Linux 互斥体必须是全局的?

标签 android linux multithreading

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

编辑: 我有一些要移植到 Linux 的 Win32 多线程代码。对于 Windows 代码,有几个包装函数封装了诸如互斥体创建和锁定/解锁之类的东西。我的理解是,通过 Windows 中的 Create() API 调用之一创建的每个同步原语都会返回一个 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());
}

最佳答案

不,它们可以限定范围。实际的互斥锁指针没有什么特别之处。

关于android - Linux 互斥体必须是全局的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13736955/

相关文章:

java - 如何在多线程程序中保存线程变量的值

android - 我可以使用 URL 更改 firebase 实时数据库吗?

java - Spinner 不会在 webview 加载时消失 - android

java - Android 转弯 API?

c++ - Linux 中的静态链接可移植吗?

python - 在 PyGTK 中,如何使用线程?

java - Android EditText - 如何检测某些内容是否由 SoftKey 编写?

python - PyOpenGL + PyGame 上的奇怪 "X"

linux - shell脚本中 "&&"内部变量和外部变量的区别

java - interned 字符串上的嵌套同步块(synchronized block)