共享互斥体和互斥体之间的区别(为什么两者都存在于 C 11 中)?

新手上路,请多包涵
阅读 684
2 个回答

通过使用普通的互斥锁,您可以保证对某种关键资源的独占访问——除此之外别无其他。共享互斥体通过允许两个级别的访问来扩展此功能:共享和独占,如下所示:

  • 独占访问防止任何其他线程获取互斥锁,就像普通互斥锁一样。其他线程是否尝试获取共享或独占访问并不重要。
  • 共享访问允许多个线程获取互斥锁,但它们 只能在共享模式下。在所有先前的共享持有者都返回互斥锁之前,不会授予独占访问权(通常,只要独占请求正在等待,新的共享持有者就会排队等待在独占访问 之后 被授予)。

一个典型的场景是数据库:多个线程同时读取一个相同的数据并不重要。但是数据库的修改是至关重要的——如果某个线程读取数据而另一个线程正在写入它可能会收到不一致的数据。因此,所有读取必须在允许写入之前完成,并且新的读取必须等到写入完成。写入后,可以再次同时进行进一步的读取。

编辑: 旁注:

为什么读者需要一把锁?

这是为了防止写入器在读取时获取锁。此外,如果它还被独占持有,它会阻止新读者获取锁。

原文由 Aconcagua 发布,翻译遵循 CC BY-SA 4.0 许可协议

“共享互斥锁通常用于多个读取器可以同时访问同一资源而不会导致数据竞争但只有一个写入器可以这样做的情况。”

cppreference.com

当您需要读/写锁时,这很有用: https ://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock

原文由 0xBADF00 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题