读者-写者问题
一个缓冲区,有些进程只读取里面的内容,另外有的进程会修改里面的内容。为了保持数据的一致性,如果没有进程修改内容时,任意个读进程可以同时访问缓冲区,但是同一时间只能有一个写进程可以访问缓冲区,其它写进程和读进程都不能对缓冲区进行操作。
读者-写者问题和生产者-消费者问题不同的是,后者的每个线程都要修改缓冲区的内容,所以不得不使用互斥锁来保证数据一致性,而前者有些线程是只读的,多个只读线程同时访问并不会出现数据不一致的情况,所以在实现上不必为每个线程都加一个互斥锁,而是让多个读线程可以同时访问,只有写进程的访问是互斥的。
使用互斥锁实现
下面是利用 pthread_mutex 系列函数的实现。
#include <stdio.h>
#include <pthread.h>
struct pool {
int nr_reader;
unsigned long long value;
pthread_mutex_t may_write, rd_count_mutex;
};
static void* writer(void* arg)
{
struct pool* p = arg;
while (1) {
pthread_mutex_lock(&p->may_write);
++p->value;
printf("writer:
… 阅读全文…