linux读者写者问题c语言、
时间: 2023-12-03 09:03:16 浏览: 29
读者写者问题是一个经典的并发编程问题,也称为读写锁问题。在linux下,有多种方式实现读写锁,其中比较常用的是pthread_rwlock_t类型的读写锁。下面是一个使用pthread_rwlock_t实现的读者写者问题的示例代码:
```
#include <stdio.h>
#include <pthread.h>
pthread_rwlock_t rwlock;
int data = 0;
void *reader(void *arg) {
int id = *(int *)arg;
while (1) {
pthread_rwlock_rdlock(&rwlock);
printf("Reader %d read data: %d\n", id, data);
pthread_rwlock_unlock(&rwlock);
sleep(1);
}
return NULL;
}
void *writer(void *arg) {
int id = *(int *)arg;
while (1) {
pthread_rwlock_wrlock(&rwlock);
data++;
printf("Writer %d write data: %d\n", id, data);
pthread_rwlock_unlock(&rwlock);
sleep(2);
}
return NULL;
}
int main() {
pthread_t readers[3], writers[2];
int i, id[3], j, jd[2];
pthread_rwlock_init(&rwlock, NULL);
for (i = 0; i < 3; i++) {
id[i] = i;
pthread_create(&readers[i], NULL, reader, &id[i]);
}
for (j = 0; j < 2; j++) {
jd[j] = j;
pthread_create(&writers[j], NULL, writer, &jd[j]);
}
for (i = 0; i < 3; i++) {
pthread_join(readers[i], NULL);
}
for (j = 0; j < 2; j++) {
pthread_join(writers[j], NULL);
}
pthread_rwlock_destroy(&rwlock);
return 0;
}
```
在这个示例代码中,有三个读者线程和两个写者线程。读者线程通过调用pthread_rwlock_rdlock函数获取读锁,然后读取共享数据data,并在读取完之后调用pthread_rwlock_unlock函数释放读锁。写者线程通过调用pthread_rwlock_wrlock函数获取写锁,然后修改共享数据data,并在修改完之后调用pthread_rwlock_unlock函数释放写锁。通过使用pthread_rwlock_t类型的读写锁,可以保证在同一时间只有一个线程能够获取写锁,但多个线程可以同时获取读锁,从而实现读者写者问题的同步。