std::shared_mutex(读写锁机制)
std::shared_mutex
是C++17标准库中新增的一个类,它提供了读写锁机制,可以同时支持多个线程对同一个资源进行读操作,但只能支持一个线程对同一个资源进行写操作。这样可以避免多个线程同时写同一个资源而导致的数据竞争问题,提高程序的并发性能。
示例
下面是一个简单的例子,演示了如何使用std::shared_mutex
来实现读写锁机制:
#include <iostream>
#include <thread>
#include <shared_mutex>
std::shared_mutex mtx; // 创建一个读写锁对象
int count = 0; // 共享资源
void read() {
std::shared_lock<std::shared_mutex> lock(mtx); // 创建一个读锁保护对象,自动加读锁
std::cout << "count = " << count << std::endl; // 读取共享资源
} // 读锁保护对象被销毁时,自动解读锁
void write() {
std::unique_lock<std::shared_mutex> lock(mtx); // 创建一个写锁保护对象,自动加写锁
++count; // 修改共享资源
} // 写锁保护对象被销毁时,自动解写锁
int main() {
std::thread t1(read);
std::thread t2(read);
std::thread t3(write);
t1.join();
t2.join();
t3.join();
return 0;
}
在上面的例子中,我们创建了一个读写锁对象mtx
,并定义了一个共享资源count
。在read
函数中,我们创建了一个读锁保护对象lock
,它会自动加读锁,然后读取共享资源count
。在read
函数返回时,读锁保护对象lock
会自动解读锁。在write
函数中,我们创建了一个写锁保护对象lock
,它会自动加写锁,然后修改共享资源count
。在write
函数返回时,写锁保护对象lock
会自动解写锁。在main
函数中,我们创建了三个线程t1
、t2
和t3
,它们分别调用read
函数和write
函数来读取和修改共享资源count
。可以看到,两个读线程可以同时读取共享资源,而写线程必须等待读线程结束后才能修改共享资源,这样可以避免多个线程同时写同一个资源而导致的数据竞争问题。
std::mutex
和std::shared_mutex
都是C++标准库中提供的线程安全机制,它们的主要区别在于锁的类型和使用场景。
std::shared_mutex
和std::mutex
区别
std::mutex
是一种互斥锁,它只支持独占访问,即同一时间只能有一个线程访问被保护的资源。如果多个线程同时访问被保护的资源,其中一个线程会获得锁,其他线程会被阻塞,直到获得锁的线程释放锁。std::mutex
适用于对共享资源进行独占访问的场景,例如生产者消费者模型中的缓冲区。
std::shared_mutex
是一种读写锁,它支持共享访问和独占访问。多个线程可以同时读取被保护的资源,但只能有一个线程进行写操作。如果一个线程正在进行写操作,其他线程无法进行读操作或写操作,直到写操作完成。std::shared_mutex
适用于对共享资源进行读写操作的场景,例如数据库中的读写操作。
总的来说,std::mutex
适用于对共享资源进行独占访问的场景,而std::shared_mutex
适用于对共享资源进行读写操作的场景。如果你需要对共享资源进行独占访问,可以使用std::mutex
,如果你需要对共享资源进行读写操作,可以使用std::shared_mutex
。