C++17 std::shared_mutex(读写锁机制)(提高并发)

文章目录

    • std::shared_mutex(读写锁机制)
    • 示例
    • `std::shared_mutex`和`std::mutex`区别

std::shared_mutex(读写锁机制)

std::shared_mutex是C++17标准库中新增的一个类,它提供了读写锁机制,可以同时支持多个线程对同一个资源进行读操作,但只能支持一个线程对同一个资源进行写操作。这样可以避免多个线程同时写同一个资源而导致的数据竞争问题,提高程序的并发性能。

示例

下面是一个简单的例子,演示了如何使用std::shared_mutex来实现读写锁机制:

#include 
#include 
#include 

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函数中,我们创建了三个线程t1t2t3,它们分别调用read函数和write函数来读取和修改共享资源count。可以看到,两个读线程可以同时读取共享资源,而写线程必须等待读线程结束后才能修改共享资源,这样可以避免多个线程同时写同一个资源而导致的数据竞争问题。

std::mutexstd::shared_mutex都是C++标准库中提供的线程安全机制,它们的主要区别在于锁的类型和使用场景。

std::shared_mutexstd::mutex区别

std::mutex是一种互斥锁,它只支持独占访问,即同一时间只能有一个线程访问被保护的资源。如果多个线程同时访问被保护的资源,其中一个线程会获得锁,其他线程会被阻塞,直到获得锁的线程释放锁。std::mutex适用于对共享资源进行独占访问的场景,例如生产者消费者模型中的缓冲区。

std::shared_mutex是一种读写锁,它支持共享访问和独占访问。多个线程可以同时读取被保护的资源,但只能有一个线程进行写操作。如果一个线程正在进行写操作,其他线程无法进行读操作或写操作,直到写操作完成。std::shared_mutex适用于对共享资源进行读写操作的场景,例如数据库中的读写操作。

总的来说,std::mutex适用于对共享资源进行独占访问的场景,而std::shared_mutex适用于对共享资源进行读写操作的场景。如果你需要对共享资源进行独占访问,可以使用std::mutex,如果你需要对共享资源进行读写操作,可以使用std::shared_mutex

你可能感兴趣的:(C/C++,c++)