boost::shared_mutex与boost::upgrade_mutex的区别及写者饥饿规避咨询
问题核心
你需要实现写者优先的读写锁:当有写者等待独占锁时,后续读者无法获取共享锁,以此避免写者饥饿。测试发现boost::shared_mutex和boost::upgrade_mutex在该场景下行为一致,想明确两者差异及该行为的官方保障。
1. 两者的核心差异
- boost::shared_mutex:基础读写锁实现,仅支持两种锁模式:
- 共享读锁(
shared_lock):多线程可同时持有,用于只读操作 - 独占写锁(
unique_lock):同一时间仅一个线程持有,用于写操作
- 共享读锁(
- boost::upgrade_mutex:
shared_mutex的扩展实现,额外支持升级锁(upgrade_lock):- 线程可先以共享读模式持有
upgrade_lock,之后通过upgrade_to_unique_lock()原子地将锁升级为独占写锁,无需先释放读锁再争抢写锁,适配"先读后写"的场景
- 线程可先以共享读模式持有
- 你测试的场景属于两者共有的基础读写锁调度逻辑,因此表现完全一致。
2. 写者优先行为的官方保障
Boost官方文档明确规定,shared_mutex(以及继承它的upgrade_mutex)采用写者优先的调度策略:
- 当已有写者在等待获取独占锁时,后续的共享读锁请求会被阻塞,不会插队到写者前面获取锁
- 只有当所有等待的写者都完成锁的获取与释放后,阻塞的读者才能继续获取共享锁
这一设计正是为了避免写者饥饿,完全符合你的需求。
3. 验证upgrade_mutex独特性的测试方向
如果想验证upgrade_mutex的特有功能,可以编写锁升级的测试代码,示例逻辑如下:
#include <iostream> #include <thread> #include <chrono> #include <boost/thread/locks.hpp> #include <boost/thread/upgrade_mutex.hpp> int main() { boost::upgrade_mutex mutex; // 线程1先持有升级锁(共享读模式) std::thread t1([&mutex]() { boost::upgrade_lock<boost::upgrade_mutex> upgrade_lock(mutex); std::cout << "Thread 1 got upgrade lock (shared mode)" << std::endl; // 模拟读操作 std::this_thread::sleep_for(std::chrono::seconds(1)); // 升级为独占写锁 boost::upgrade_to_unique_lock<boost::upgrade_mutex> write_lock(upgrade_lock); std::cout << "Thread 1 upgraded to unique lock (write mode)" << std::endl; // 模拟写操作 std::this_thread::sleep_for(std::chrono::seconds(1)); }); // 线程2尝试获取共享读锁,会被阻塞直到线程1完成升级并释放锁 std::thread t2([&mutex]() { std::cout << "Thread 2 trying to get shared lock..." << std::endl; boost::shared_lock<boost::upgrade_mutex> read_lock(mutex); std::cout << "Thread 2 got shared lock" << std::endl; }); t1.join(); t2.join(); return 0; }
内容的提问来源于stack exchange,提问作者av4625
相关产品推荐
相关产品推荐

