c++11 thread中使用 读写锁
时间: 2023-09-03 11:15:41 浏览: 105
C11标准库中提供了读写锁,可以用来实现多个线程对同一资源的并发读写操作。下面是使用读写锁的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <threads.h>
int data = 0;
rwlock_t lock;
int reader(void* arg) {
int id = *(int*)arg;
while (1) {
thrd_sleep((struct timespec){.tv_sec = 1}, NULL); // 模拟读操作
// 加读锁
rwlock_rdlock(&lock);
printf("Reader %d read data: %d\n", id, data);
// 释放读锁
rwlock_unlock(&lock);
}
return 0;
}
int writer(void* arg) {
int id = *(int*)arg;
while (1) {
thrd_sleep((struct timespec){.tv_sec = 2}, NULL); // 模拟写操作
// 加写锁
rwlock_wrlock(&lock);
data++;
printf("Writer %d write data: %d\n", id, data);
// 释放写锁
rwlock_unlock(&lock);
}
return 0;
}
int main(int argc, char const *argv[]) {
// 初始化读写锁
rwlock_init(&lock);
// 创建3个读线程
thrd_t readers[3];
int readerIds[3];
for (int i = 0; i < 3; i++) {
readerIds[i] = i + 1;
thrd_create(&readers[i], reader, &readerIds[i]);
}
// 创建2个写线程
thrd_t writers[2];
int writerIds[2];
for (int i = 0; i < 2; i++) {
writerIds[i] = i + 1;
thrd_create(&writers[i], writer, &writerIds[i]);
}
// 等待所有线程结束
for (int i = 0; i < 3; i++) {
thrd_join(readers[i], NULL);
}
for (int i = 0; i < 2; i++) {
thrd_join(writers[i], NULL);
}
// 销毁读写锁
rwlock_destroy(&lock);
return 0;
}
```
这个示例程序中有3个读线程和2个写线程,读线程每隔1秒钟读一次共享变量data的值,写线程每隔2秒钟写一次共享变量data的值。读线程和写线程之间会相互竞争读写锁,以实现对共享变量的并发访问。
阅读全文