Linux互斥锁必须是全局的吗?

Posted

技术标签:

【中文标题】Linux互斥锁必须是全局的吗?【英文标题】:Linux mutexes must be global? 【发布时间】:2012-12-06 04:26:18 【问题描述】:

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

编辑: 我有一些要移植到 Linux 的 Win32 多线程代码。对于 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());

【问题讨论】:

【参考方案1】:

不,它们可以作用域。实际的互斥指针没有什么特别之处。

【讨论】:

【参考方案2】:

你的要求有点不对。互斥锁不需要是全局的,但是,您不能静态初始化非静态互斥锁。但是您不需要在调用 pthread_mutex_init 之前静态初始化互斥锁,因为它会初始化它。所以不要使用静态初始化器,而是调用pthread_mutex_init

它实际上会起作用,但由于实施的细节,这是幸运的。请不要依赖实现细节。

静态初始化仅适用于静态分配存储[.] ...虽然 C 语法允许在“自动”变量上使用静态初始化宏,但 POSIX 标准明确禁止这样做。这是不正确的,也不是便携式的。 - David Butenhof

【讨论】:

以上是关于Linux互斥锁必须是全局的吗?的主要内容,如果未能解决你的问题,请参考以下文章

linux下信号量和互斥锁的区别

Linux 线程同步都有哪些方法?

Linux下的互斥锁和条件变量

linux多线程——互斥量实现同步

在 C# 中使用全局互斥锁的好模式是啥?

07-互斥锁import threading# 定义全局变量g_num = 0# 创建全局的互斥锁lock