有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据结构时则可能导致数据不一致的错误。因此要求:(1)允许多个读者可以同时对文件执行读操作。(2)只允许一个写者往文件中写信息。(3)任一写者在完成写操作之前不允许其他读者或写者工作。(4)写者执行写操作前,应让已有的读者和写者全部退出。请添加必要的信号量和P,V操作实现上述过程中的互斥和同步,要求用伪代码来描述。
答:实现题干过程中的互斥和同步的伪代码如下:
int rc = 0, wc = 0;//用于读者、写者的计数semaphore read, write = 1;//用于读进程和写进程的互斥信号量semaphore rc_mutex, wc_mutex, write_first = 1;//用于读时、写时和写着优先的互斥//读进程void reader() { while (1) { P(write_first);//用来保证写者优先。若有写进程,第二个后的读进程等待在这里 P(read);//若有写进程,第一个读进程等待;若无写进程,读进程进入 P(rc_mutex);//开始对rc共享变量进行互斥访问 rc++;//更新读进程的数量 if (rc == 1)//第一个读进程需要判断是否有写进程在临界区,若有,读进程等待;若无,阻塞写进程 P(write); V(rc_mutex);//结束对rc共享变量的互斥访问 V(read);//从read队列中唤醒一个进程 V(write_first); 读取文件; P(rc_mutex);//开始对rc共享变量进行互斥访问 rc--;//更新读进程的数量 if (rc == 0)//最后一个离开临界区的读进程需要判断是否有写进程需要进入临界区。若有,唤醒一个写进程进入临界区 V(write); V(rc_mutex);//结束对rc共享变量的互斥访问 }}//写进程void write() { while (1) { P(wc_mutex);//开始对wc共享变量进行互斥访问 wc++;//更新写进程数 if (wc == 1)//第一个写进程需要判断是否有读进程在临界区,若有,写进程阻塞;若无,阻塞新的读进程 P(read); V(wc_mutex);//结束wc共享变量进行互斥访问 P(write);//限制同一时刻只能有一个写进程进行写操作 写文件; V(write);//结束对写操作的限制 P(wc_mutex);//开始对wc互斥访问 wc--;//更新写进程数 if (wc == 0)//最后一个离开临界区的写进程需要判断是否有读进程需要进入,若有,唤醒一个读进程进入临界区 V(read); V(wc_mutex);//结束对wc的互斥访问 }}
【考点】本题考查信号量机制。
扫描微信二维码,添加您的专属老师为好友
您在考试中遇到任何问题,老师都会帮您解答
您希望我们通过哪种方式与您联系?
您已选择电话/微信/QQ的联系方式,课程顾问会尽快联系您!
您已选择微信联系方式,课程顾问会尽快添加您的微信,请您确认通过!
您已选择QQ联系方式,课程顾问会尽快添加您的QQ,请您确认通过!
您已选择电话联系方式,课程顾问会尽快联系您!
您已选择“不联系”,课程顾问不会主动联系您。如果后续您有需求,可以在个人中心主动添加销售微信或拨打客服电话:400-111-9811