📅  最后修改于: 2023-12-03 15:28:37.764000             🧑  作者: Mango
本篇为 GATE (Graduate Aptitude Test in Engineering) 计算机科学考试 2012 年的第 18 题。该问题属于操作系统课程,主要涉及进程同步和信号量。
考虑如下的代码片段:
semaphore mutex = 1;
semaphore wrt = 1;
int readcount = 0;
void writer(void) {
while (true) {
down(&wrt);
/* writing is performed */
up(&wrt);
}
}
void reader(void) {
while (true) {
down(&mutex);
readcount++;
if (readcount == 1)
down(&wrt);
up(&mutex);
/* reading is performed */
down(&mutex);
readcount--;
if (readcount == 0)
up(&wrt);
up(&mutex);
}
}
其中 down
和 up
是 P(s) 和 V(s) 操作,分别表示将信号量 s 减 1 和加 1。
关于这段代码,有以下问题:
首先来理解一下这段代码的作用。上述代码片段是用来模拟读者-写者问题的,其中 writer
和 reader
分别表示写者和读者的函数。在读者和写者中,都有一段加锁的代码,指的是 down(&mutex)
后面的代码。该操作的目的是为了保证在此期间,其他读者或者写者不会执行加锁代码之后的操作。在读者中,为了保证只有一个写者在操作共享资源时,会先执行 if (readcount == 1) down(&wrt);
,其中 readcount
表示已经有多少个读者进入了临界区,只有当 readcount = 1
时,才会一次性地将 wrt
的信号量减 1,以此使其他的写者不能同时写。
然而,这段代码存在以下错误:
readcount
的初始值没有设置,不确定初始情况下是否有读者在操作共享资源。readcount
设置初始值,避免未预料到的操作。除了上述的常见错误之外,关于读者-写者问题,还存在以下问题:
总之,在编写复杂的并发程序时,需要更加细致地考虑并发访问的情况,避免死锁、饥饿等问题的发生,从而保证程序运行的正确性和高效性。