使用std::shared_mutex时,等待独占锁的线程会被共享锁请求饥饿吗?
1. 等待独占锁的线程是否会出现饥饿?
有可能。C++标准并未强制要求std::shared_mutex实现公平性调度。如果所用编译器/标准库采用共享锁优先的逻辑,线程2、3持续重叠获取共享锁的情况下,线程1的独占锁请求可能一直被排在共享锁请求之后,导致永远无法获取锁,陷入饥饿状态。当然也有部分实现会做公平性优化,但这并非标准强制要求的行为。
2. 独占锁的请求是否会阻止新的共享锁获取?
虽然cppreference文档未明确说明,但主流标准库实现(比如GCC、MSVC)都会在有独占锁等待时,阻止新的共享锁请求。这么做是为了避免请求独占锁的写线程长期饥饿——如果允许新的共享锁不断插队,写线程可能永远抢不到锁。不过这是实现层面的行为,C++标准并未强制要求,只是实际中大部分实现都会这么处理。
需要区分两种情况:
- 当线程已持有独占锁时,其他线程无法获取共享锁(这是标准明确规定的);
- 当有线程在等待独占锁时,新的共享锁请求是否被阻塞,属于实现细节。
3. std::mutex的锁获取顺序特性是否适用于std::shared_mutex?
是的。C++标准同样没有为std::shared_mutex规定任何锁获取顺序(比如FIFO、优先级顺序等),不管是共享锁还是独占锁的请求,调度顺序完全取决于具体实现的策略,和std::mutex一致,不做任何保证。
内容的提问来源于stack exchange,提问作者CSM
相关产品推荐
相关产品推荐

