我已经检查了Boost Synchronization上的文档,而我似乎无法确定boost::unique_lock
是否会按顺序获得锁定。
换句话说,如果两个线程争用锁定已经锁定的互斥锁,那么锁定被释放后它们将尝试锁定的顺序是否会被保留?
答案 0 :(得分:1)
唯一锁不是锁(它是可以作用于任何可锁定或TimedLockable类型的锁适配器,请参阅cppreference)。
线程获取锁定(或一般资源)的顺序可能是实现定义的。这些实现通常具有记录良好的调度语义,因此应用程序可以避免资源不足,软锁和死锁。
作为一个有趣的例子,条件变量只保留调度顺序 ,如果您注意在互斥锁下发出信号(如果不这样做,除非您的调度关键取决于公平调度,否则事情通常会有效) ):
线程可以调用
pthread_cond_broadcast()
或pthread_cond_signal()
函数,无论它当前是否拥有调用pthread_cond_wait()
或pthread_cond_timedwait()
的线程与之关联的互斥锁等待期间的条件变量; 但是,如果需要可预测的调度行为,那么该互斥锁将被调用pthread_cond_broadcast()
或pthread_cond_signal()
的线程锁定。