【C++11多线程与并发编程】 (5) 读写锁
读写锁
读写锁(Read-Write Lock):
- 共享锁和独占锁:读写锁有两种锁模式:读锁(共享锁)和写锁(独占锁)。多个读线程可以同时持有读锁,但写线程必须独占持有写锁。
- 适用于:读操作远多于写操作的场景,能提高系统的并发性能。
- 开销:在读多写少的情况下,能减少锁争用,提高效率。
使用shared_lock
(C++14)和shared_mutex
(C++17)实现读写锁
#include <iostream>
#include <vector>
#include <thread>
#include <shared_mutex>
std::vector<int> data;
std::shared_mutex rw_mtx;
void addData(int value) {
std::unique_lock<std::shared_mutex> lock(rw_mtx); // 独占锁
data.push_back(value);
}
void printData() {
std::shared_lock<std::shared_mutex> lock(rw_mtx); // 共享锁
for (int value : data) {
std::cout << value << " ";
}
std::cout << std::endl;
}
int main() {
std::thread t1(addData, 1);
std::thread t2(addData, 2);
std::thread t3(printData);
t1.join();
t2.join();
t3.join();
return 0;
}
使用<pthread>
实现读写锁
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
void *reader(void *arg) {
pthread_rwlock_rdlock(&rwlock); // 获取读锁
printf("Thread %ld: Reading...\n", (long)arg);
pthread_rwlock_unlock(&rwlock); // 释放读锁
return NULL;
}
void *writer(void *arg) {
pthread_rwlock_wrlock(&rwlock); // 获取写锁
printf("Thread %ld: Writing...\n", (long)arg);
pthread_rwlock_unlock(&rwlock); // 释放写锁
return NULL;
}
int main() {
pthread_t threads[4];
pthread_create(&threads[0], NULL, reader, (void *)1);
pthread_create(&threads[1], NULL, reader, (void *)2);
pthread_create(&threads[2], NULL, writer, (void *)3);
pthread_create(&threads[3], NULL, reader, (void *)4);
for (int i = 0; i < 4; i++) {
pthread_join(threads[i], NULL);
}
pthread_rwlock_destroy(&rwlock);
return 0;
}
n(threads[i], NULL);
}
pthread_rwlock_destroy(&rwlock);
return 0;
}