返回介绍

8.4 并发

发布于 2024-08-19 12:44:37 字数 2440 浏览 0 评论 0 收藏 0

在 C++17 中,以下类型的加入极大地简化了锁的使用:

  • scoped_lock——获取任意数量的锁,而不会造成死锁
  • shared_mutexshared_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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文