文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
8.4 并发
在 C++17 中,以下类型的加入极大地简化了锁的使用:
scoped_lock
——获取任意数量的锁,而不会造成死锁shared_mutex
和shared_lock
——实现读写锁
例如,我们能获取多个锁,而不用担心会产生死锁:
void f()
{
scoped_lock lck {mutex1, mutex2, mutex3}; // 获得所有三把锁
// ... 操作共享数据 ...
} // 隐式地释放所有锁
C++11 和 C++14 没能带给我们读写锁。这显然是个严重的疏忽,原因是各种提议的压力,以及处理提议所需的时间。C++17 通过加入 shared_mutex
解决了这一问题:
shared_mutex mx; // 一个可以被共享的锁
void reader()
{
shared_lock lck {mx}; // 跟其他 reader 共享访问
// ... 读 ...
}
void writer()
{
unique_lock lck {mx}; // writer 需要独占访问
// ... 写 ...
}
多个读线程可以共享
该锁(即同时进入临界区),而写线程则需要独占访问。
我认为这些例子很好体现了简单的事情简单做
的哲学。有时,我同很多 C++ 程序员一样在想,是什么让他们花了这么长时间?
请注意使用从构造函数参数推导出来的模板参数是如何简化了写法的(§8.1)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论