60

当我阅读 and 的文档时MutexRwLock我看到的区别如下:

  • Mutex一次只能有一个读者或作者,
  • RwLock一次可以有一个作家或多个读者。

当您这样说时,RwLock似乎总是比 更好(更少限制)Mutex,那我为什么要使用它呢?

4

2 回答 2

45

有时在 Rust中使用 a Mutexover an会更好:RwLock

RwLock<T>需要更多界限T才能实现线程安全:

换句话说,Mutex是唯一可以同步的包装器T。我在 reddit 中找到了一个很好且直观的解释:

由于这些限制,RwLock 要求其内容为 Sync,即两个线程同时拥有该类型的 &ptr 是安全的。互斥锁只需要发送数据,因为从概念上讲,您可以将其想象为当您锁定互斥锁时,它会将数据发送到您的线程,而当您解锁它时,数据会发送到另一个线程。

Mutex当你的Tis onlySend和 not时使用Sync

防止作家饥饿

RwLock没有指定的实现,因为它使用系统的实现。一些读写锁可能会受到writer starvation的影响,而Mutex不会出现这种问题。

Mutex当您可能有太多读者而无法让作者拥有锁时应该使用。

于 2018-06-05T15:52:18.693 回答
3

互斥锁是一种简单的锁定方法,用于控制对共享资源的访问。

  • 同时,只有一个线程可以掌握一个互斥锁,处于锁定状态的线程可以访问共享资源。
  • 如果另一个线程想要锁定已被互斥的资源,则该线程将挂起,直到被锁定的线程释放互斥锁。

读写锁比互斥锁更复杂。

  • 使用互斥锁的线程缺乏读取并发性。
  • 当读操作较多而写操作较少时,可以使用读写锁来提高线程读并发。

让我自己总结一下:

  • 读写锁的实现比互斥锁复杂,性能较差。
  • 读写锁支持多线程同时读取。互斥锁不支持多线程同时读取,所以读写锁具有高并发性。
于 2021-08-27T02:23:28.507 回答