关于pthread_mutex_lock和pthread_mutex_unlock的一些问题

时间:2010-09-13 07:08:16

标签: linux multithreading pthreads

当线程获得锁并执行以下代码时,线程是否可以解锁它刚刚使用return语句获取的锁?一些像这样的代码。

static pthread_mutex_t mutex;

    int foo()
    {
        pthread_mutex_lock(mutex);

        .........
        execute some code here and some errors happen
                return -1;// but without pthread_mutex_unlock

        pthread_mutex_unlock(mutext)
        return 0;
    }

在pthread_mutex_unlock语句之前发生了一些错误,并且线程返回到被调用方。线程是否会在不执行pthread_mutex_unlock的情况下为其他线程返回mutext锁?

2 个答案:

答案 0 :(得分:2)

不,锁不会自动释放。这就是为什么在C ++代码中,通常使用资源获取是初始化(RAII),它利用构造/销毁来确保每次对锁定函数的调用都有相应的解锁调用。但是,如果您正在编写纯C代码,则需要确保在返回之前解锁互斥锁,即使在错误情况下也是如此。

请注意,您可以通过执行以下操作使编码更容易:

  static inline int some_function_critical_section_unsynchronized(void) {
       // ...
  }
  int some_function(void) {
       int status = 0;
       pthread_mutex_lock(mutex);
       status = some_function_critical_section_unsynchronized();
       pthread_mutex_unlock(mutex);
       return status;
  }

换句话说,如果您可以将逻辑分成更小的函数,您可以从逻辑中梳理出锁定代码。当然,有时这是不可能的(比如以这种方式编码会使关键部分过大,而且对于性能而言,需要的可读性较差)。

如果你可以使用C ++,我强烈建议使用boost :: thread和boost :: scoped_lock来确保在使用超出范围时自动释放获取的互斥锁。

答案 1 :(得分:1)

不,它不会自动解锁互斥锁。如果互斥锁已被函数锁定,则必须在错误路径中显式调用pthread_mutex_unlock()