多个读者与独占写者

当读操作不会改变被保护状态时,多个读者可以并行访问;写者则必须排除其他写者和读者。C++共享互斥量明确区分共享所有权与独占所有权,不能在仍有共享持有者时让写者同时取得独占权。

这里的“读”是同步协议对操作的要求,不只是函数名字或返回值看起来像查询。若一次查询会更新缓存、统计或内部游标,就要判断这些修改是否另有保护,不能因为业务上叫读取,就放进没有写保护的共享区。

参考:[1]

取得、释放与模式转换

C++的lock_shared取得共享所有权,unlock_shared释放它;独占操作沿用互斥量的相应接口。try_lock_shared可以立即报告失败,规范还允许它在没有其他持有者时失败,所以一次失败不能当作有人正在写入的可靠检测。

模式转换必须按接口规定执行。C++共享锁获取要求调用线程此前不持有这个互斥量,不能直接把“我已经是读者”当成再次获取或原地升级的许可。若先释放读锁再取写锁,期间状态可以改变,原来读到的条件也需要重新验证。

参考:[1]

并发机会不等于公平或性能保证

如果实现持续接纳新读者,写者可能等待很久;若优先满足写者,读者也可能受到影响。C++共享互斥量的通用要求不承诺按请求先后排成公平队列,应用不能把某种实现的偏好当成所有平台的契约。

共享模式还需要维护持有者状态并协调写入。它扩大了只读操作可以重叠的机会,却不证明短小查询采用读写锁一定比普通互斥锁更省时;应结合临界区长度、竞争模式和实际实现测量,而不是仅凭“读多写少”得出必胜结论。

参考:[1]