我何时或为什么要在RwLock上使用Mutex?

Fre*_*ios 13 multithreading mutex readwritelock rust

当我读到的单证MutexRwLock,我看到区别如下:

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

当你这样说的时候,RwLock似乎总是更好(更少限制)Mutex,为什么我会使用它呢?

guo*_*ang 11

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

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

读写锁比互斥锁更复杂。

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

我自己总结一下:

  • 读写锁的实现比互斥锁复杂,性能较差。
  • 读写锁支持多线程同时读取。互斥锁不支持多线程同时读取,因此读写锁并发性较高。


Fre*_*ios 10

有时最好在Rust中使用Mutexover RwLock:

RwLock<T>需要更多的T线程安全边界:

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

由于这些边界,RwLock要求其内容为Sync,即两个线程同时具有该类型的&ptr是安全的.Mutex只需要将数据作为Send,因为从概念上讲,您可以将其视为锁定Mutex时将数据发送到您的线程,当您解锁数据时,数据会被发送到另一个线程.

Mutex在你自己使用而不是.TSendSync

防止作家饥饿

RwLock没有指定的实现,因为它使用系统的实现.一些读写锁可能会受到编写者的匮乏,Mutex不会出现这种问题.

Mutex 当你可能有太多的读者让作家拥有锁时,应该使用它.

  • 虽然问题在“锈”标签下,但我在 [ReadWriteLock](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent /locks/ReadWriteLock.html) 接口对 _user_ 在互斥锁和读写锁之间进行选择时必须考虑的各种事项以及可能的实现权衡进行了相当全面的讨论。 (6认同)
  • 只有读/写锁的简单实现才会让写者挨饿。如果我负责一个可以从读取器/写入器锁中受益的应用程序,并且如果我必须将其部署在“标准”读取器/写入器锁很糟糕的某个平台上,那么我会编写自己的应用程序——量身定制我的应用程序的需求——而不是退回到简单的互斥锁。 (4认同)
  • 我会在这里触及*performance*和*intent*.这是(1)RW Lock实现通常更复杂,因此更慢,(2)如果您的算法只需要Mutex,使用RW Lock只会让您的读者感到困惑而没有任何好处.甚至可以添加正确性:如果您通过随机将Mutex升级到RW Lock来解决锁定问题,那么您就是干杯.多线程和分布式编程需要清晰的数据流模型; 只是随意扔锁,不会神奇地纠正流量. (3认同)