shared_mutex 通常用于多个读线程能同时访问同一资源而不导致数据竞争,但只有一个写线程能访问的情形。 1.认识std::shared_mutex 通过查看该类的接口(https://zh.cppreference.com/w/cpp/thread/shared_mutex),可以看到,该类除了互斥锁定接口,还提供了共享锁定接口。 lock() 锁定互斥。若另一线程已锁定互斥,则到...
std::shared_mutex使用 std::shared_mutex是C++17引入的一个同步原语,标准库中提供。它设计用于实现读写锁(Read-Write Lock)机制。允许多个线程同时拥有读(共享)锁,但在任何时间点上只允许一个线程拥有写(独占)锁。这种机制非常适合于多读少写的场景,因为它能够最大化读操作的并发性,同时确保写操作的安全性。
定义于头文件 <shared_mutex> class shared_mutex; (C++17 起) shared_mutex 类是一个同步原语,可用于保护共享数据不被多个线程同时访问。与便于独占访问的其他互斥类型不同,shared_mutex 拥有二个访问级别: 共享 - 多个线程能共享同一互斥的所有权。 独占性 - 仅一个线程能占有互斥。 若一个线程已获取...
优点:std::shared_mutex 允许多个读线程同时访问共享资源,提高了并发性能。 缺点:实现更复杂,且在写操作频繁的场景下性能可能不如 std::mutex。 与条件变量的对比: 共同点:都用于线程间的同步。 不同点:条件变量通常与互斥锁一起使用,用于等待某个特定条件的满足;而 std::shared_mutex 则专门用于读写锁的实现。
shared_mutex的适用场景比较特殊:一个或多个读线程同时读取共享资源,且只有一个写线程来修改这个资源,这种情况下才能从shared_mutex获取性能优势。 cppreference文档 http://en.cppreference.com/w/cpp/thread/shared_mutex Shared mutexes are usually used in situations when multiple readers can access the same ...
lock是用于管理std::shared_mutex的 RAII 风格锁 , 这里就只说std::shared_mutex普通读者(shared_...
shared_mutex类是一个同步原语,可用于保护共享数据不被多个线程同时访问。与便于独占访问的其他互斥类型不同,shared_mutex 拥有二个访问级别: 共享- 多个线程能共享同一互斥的所有权。 独占性- 仅一个线程能占有互斥。 若一个线程已获取独占性锁(通过lock、try_lock),则无其他线程能获取该锁(包括共享的)。
对于shared_mutex,可以理解为共享锁,允许多个线程同时对同一资源进行读操作。而lock_guard、unique_lock可以理解为独占锁,只允许一个线程对资源进行写操作。 在一些只读函数中可以用std::shared_mutex,而在写操作函数中需用std::unique_lock。 std::shared_mutex是c++17中引入的,不支持std::mutex,需用std::shared_...
以下是 std::shared_mutex 的一些主要应用: 当读取数据是主要操作并且写入数据不常见时,共享互斥体可以提供有效的并行性。 共享互斥体可用于缓存算法允许一个线程同时更新缓存,同时允许多个线程读取已缓存的数据。 数据库连接池允许多个线程同时读取和更新连接信息,但不允许同时修改。
1.2std::shared_mutex的成员函数 std::shared_mutex提供了以下主要成员函数: lock():获取独占锁,阻塞直到成功获取。 unlock():释放独占锁。 try_lock():尝试获取独占锁,立即返回是否成功。 lock_shared():获取共享锁,阻塞直到成功获取。 unlock_shared():释放共享锁。