互斥锁的可升级所有权如何影响其他线程

How does the upgradable ownership of a mutex affect other threads?

本文关键字:影响 线程 其他 何影响 可升级 所有权      更新时间:2023-10-16

情况如下:

一个线程获得了一个boost:: shared_互斥锁的可升级所有权,并且正在调用unlock_upgrade_and_lock(),这会阻塞,因为其他线程同时拥有同一个shared_互斥锁的共享所有权。

第一个线程的可升级所有权是否会阻止(阻止)其他线程在试图"lock_shared"shared_mutex时,使所有已经共享所有权的线程最终解锁并保证第一个线程的独占所有权?

或者只要有另一个线程共享互斥锁,第一个线程就有可能保持阻塞?

(假设Boost实现模糊地模拟了Howard Hinnant的WG21提案…)

从共享所有权转换为升级所有权可以防止任何新线程获取锁,因此最终所有共享所有者都会释放锁,具有升级所有权的线程可以将其转换为独占所有权。这就是"升级锁"相对于共享锁和排他锁的意义所在,参见N3427中的解释:

请注意,另一种尝试转换从共享到独占的设计,而不是如图所示从共享到升级的设计,将容易出现更新(写入器)不足的情况。这是因为只要存在多个搜索器(共享锁),就没有一个搜索器能够成功地尝试转换为更新程序。只有成功地将自己注册为拥有升级所有权的单个线程,然后阻止从升级到独占的转换,才能使实现开始阻止新的搜索者获得共享锁,以便在清除现有搜索者时最终获得独占锁。