当我阅读Mutex
和RwLock
的文档时,我看到的区别如下:
Mutex
一次只能有一个读取器或写入器,RwLock
一次可以有一个或多个读取器。
当你这样说时,RwLock
似乎总是比Mutex
更好(更少限制(,那我为什么要使用它呢?
有时最好在 Rust 中使用Mutex
而不是RwLock
:
RwLock<T>
需要更多边界才能使T
线程安全:
Mutex
要求T: Send
Sync
,RwLock
要求T
是Send
,Sync
是Sync
本身。
换句话说,Mutex
是唯一可以使T
同步的包装器。我在reddit上找到了一个很好且直观的解释:
由于这些边界,RwLock 要求其内容是同步的,即两个线程同时具有该类型的 &ptr 是安全的。互斥体只要求发送数据,因为从概念上讲,你可以把它想象成当你锁定互斥锁时,它会将数据发送到你的线程,当你解锁它时,数据会被发送到另一个线程。
当您的T
仅Send
而不Sync
时,请使用Mutex
。
防止作家饥饿
RwLock
没有指定的实现,因为它使用系统的实现。某些读写锁可能会受到写入器匮乏的影响,而Mutex
不会出现此类问题。
当您的读者可能太多而无法让作者锁定时,应该使用Mutex
。
互斥是一种简单的锁定方法,用于控制对共享资源的访问。
- 同时,只有一个线程可以主打互斥锁,锁定状态的线程可以访问共享资源。
- 如果另一个线程想要锁定已互斥的资源,则该线程将挂起,直到锁定的线程释放互斥锁。
读写锁比互斥锁更复杂。
- 使用互斥锁的线程缺乏读取并发性。 当读取操作
- 较多而写入操作较少时,可以使用读写锁来提高线程读取并发性。
让我自己总结一下:
- 读写锁的实现比 互斥锁,且性能较差。
- 读写锁支持多个线程同时读取。互斥锁不支持多线程同时读取,因此读写锁具有高并发性。