C++读写锁

Aki 发布于 2023-10-31 166 次阅读


shared_mutex(也称为共享互斥锁或读写锁)是一种特殊类型的互斥锁,用于允许多个线程同时读取共享数据,但在写入期间只允许一个线程进行写入。

在读取共享数据时,多个线程可以同时获取共享锁(读锁),这样可以实现并发读取而无需加锁等待。这对于读多写少的情况非常有用,因为读取操作不会相互干扰。

而当某个线程想要写入共享数据时,必须先获取独占锁(写锁),并且在写入期间不允许其他线程读取或写入数据。这样可以确保数据的一致性。

shared_mutex 提供了两种锁定模式:共享模式(shared mode)和独占模式(exclusive mode),它们都允许多个线程并发地获取共享锁,但在获取独占锁时会进行互斥。

共享锁对应 shared_lock<shared_mutex>;独占锁对应lock_guard<shared_mutex>或者unique_lock<shared_mutex>。


//两个锁,一个是读写锁,一个是互斥锁锁屏幕
std::shared_mutex _mutex, _mm;
int sharedData = 0;

void reader()
{
	while (true)
	{
		shared_lock lock(_mutex);
		scoped_lock lk(_mm);
		cout << this_thread::get_id() << " Reader: " << sharedData << std::endl;
		this_thread::sleep_for(chrono::milliseconds(1000));
	}
}

void writer()
{
	while (true)
	{
		scoped_lock lock(_mutex);
		scoped_lock lk(_mm);
		sharedData++;
		cout << this_thread::get_id() << " Writer: " << sharedData << std::endl;
		this_thread::sleep_for(std::chrono::milliseconds(1000));
	}
}

int main()
{

	std::jthread readerThread1(reader);
	std::jthread readerThread2(reader);
	std::jthread writerThread(writer);

	return 0;
}