【发布时间】:2021-11-08 21:44:06
【问题描述】:
mutex 引用的互斥对象应通过调用pthread_mutex_lock() 来锁定。如果互斥锁已被锁定,则调用线程应阻塞,直到互斥锁可用。此操作应返回 mutex 所引用的互斥对象,该对象处于锁定状态,调用线程为其所有者。
我的问题是,如果互斥体已经被锁定,并且我们调用pthread_mutex_lock(),这个函数是在线程被阻塞的情况下返回一个值,还是在阻塞之后返回值?
我的问题的说明。
-
Mutex 被第一个线程锁定。
-
第二个线程尝试使用
pthread_mutex_lock()锁定此互斥体。
会发生什么? pthread_mutex_lock() 什么时候将其值返回给第二个线程?
是在第一个线程解锁互斥锁之后吗?或者,它是否返回它的值然后阻塞第二个线程?
【问题讨论】:
-
不加锁就不会被阻塞,第一个线程跑到互斥锁中就是这样。只有下一个线程会阻塞(直到第一个线程释放互斥锁)
-
函数阻塞直到互斥锁可用,然后返回锁定状态的互斥锁句柄。在解除阻塞之前它不会返回。
-
@DanielFarrell 当第二个线程试图锁定这个锁定的互斥体时,pthread_mutex_lock() 只会在互斥体解锁时返回一个值,对吧?
-
@African_king
pthread_mutex_lock()等到互斥锁被解锁,然后锁定它,然后向调用者返回一个值 -
是的,这就是可观察到的效果。不过,这不是一个忙碌的等待!在互斥锁解锁之前,被互斥锁“停止”的线程不会消耗任何 CPU 周期。