开局一张图
代码一贴
#include <stdio.h>
#include <pthread.h>
#include<semaphore.h>
#define P sem_wait
#define V sem_post
#define writeblock &writeblock_
#define mutex &mutex_
sem_t writeblock_;
sem_t mutex_;
int readcount=0;
void * reader_i()
{
P(mutex); //表示对进入人数的一个互斥信号量
readcount++;
/*由于有了这处的判断,一来可以在读者来的时候写者不能进入阅览室
二来 就是写者在写的时候,这里P操作就会得到一个负数 这样自身就被阻塞,就完成了写者写的时候读者不能够进阅览室*/
if(readcount == 1)
P(writeblock);
V(mutex);
printf("读者开始读取书籍\n");
P(mutex);
readcount--;
if(readcount == 0)
V(writeblock);
V(mutex);
}
void writer_i()
{
P(writeblock);
printf("写者修改书籍\n");
V(writeblock);
}
int main()
{
sem_init( writeblock,0,1); //sem_init 的使用请自行百度
sem_init(mutex,0,1);
pthread_t tid1;
pthread_t tid11;
pthread_t tid111;
pthread_t tid22;
pthread_t tid2;
pthread_create(&tid2,NULL,writer_i,NULL);
pthread_create(&tid1,NULL,reader_i,NULL);
pthread_create(&tid22,NULL,writer_i,NULL);
pthread_create(&tid11,NULL,reader_i,NULL);
pthread_create(&tid111,NULL,reader_i,NULL);
pthread_exit(0);
return 0;
}
分析上述程序,我们可以得知,当第一个读者来的时候,写者就被阻塞,如果接下来不断有读者来的话,就有可能出现一个极端的情况,就是写者一直在外面等待的现象,也就是饥饿现象。为了尽量避免这种情况,我们应该增加一个信号量来保证写者在等待时候,能有几率获得进去图书馆修改书籍
代码一换
#include <stdio.h>
#include <pthread.h>
#include<semaphore.h>
#define P sem_wait
#define V sem_post
#define writeblock &writeblock_
#define mutex &mutex_
#define mutex1 &mutex1_
sem_t writeblock_;
sem_t mutex_;
sem_t mutex1_;
int readcount=0;
void * reader_i()
{
P(mutex1);
P(mutex);
readcount++;
if(readcount == 1)
P(writeblock);
V(mutex);
V(mutex1);
printf("读者开始读取书籍\n");
P(mutex);
readcount--;
if(readcount == 0)
V(writeblock);
V(mutex);
}
void writer_i()
{
P(mutex1);
P(writeblock);
printf("写者修改书籍\n");
V(writeblock);
V(mutex1);
}
int main()
{
sem_init( writeblock,0,1);
sem_init(mutex,0,1);
sem_init(mutex1,0,1);
pthread_t tid1;
pthread_t tid11;
pthread_t tid111;
pthread_t tid22;
pthread_t tid2;
pthread_create(&tid1,NULL,reader_i,NULL);
pthread_create(&tid11,NULL,reader_i,NULL);
pthread_create(&tid111,NULL,reader_i,NULL);
pthread_create(&tid2,NULL,reader_i,NULL);
pthread_create(&tid22,NULL,writer_i,NULL);
pthread_exit(0);
return 0;
}
显然,现在写者是有更大的几率可以进去修改书籍了,不用一直傻傻等待到最后…