当线程获得锁并执行以下代码时,线程是否可以解锁它刚刚使用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锁?
答案 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()
。