互斥锁的线程所有权问题:非持有线程能否解锁?
线程解锁互斥锁的核心规则:必须先持有锁才能解锁
各位开发者要记牢这个铁则:线程只有在显式锁定并持有目标互斥锁的前提下,才能执行解锁操作。
这一点在权威文档里有明确规定,比如IBM的pthread_mutex_unlock手册页就明确指出:
pthread_mutex_unlock()函数用于解锁指定的互斥锁。若调用线程当前未持有该互斥锁(未通过之前调用pthread_mutex_lock()、pthread_mutex_trylock()或pthread_mutex_timedlock_np()获取),解锁请求将因EPERM错误失败。
不光是POSIX线程接口,新版C++标准也有类似约束——如果线程未持有对应互斥锁就尝试解锁,属于未定义行为,大多数主流编译器和运行时环境都会触发错误,甚至直接终止程序。
简单总结:解锁操作的前提是你已经通过合法的锁定调用(比如pthread_mutex_lock或者C++的std::lock_guard/std::unique_lock)拿到了锁的所有权,否则就是违规操作,必然会引发问题。
内容的提问来源于stack exchange,提问作者dors
相关产品推荐
相关产品推荐

