1、读者优先:
semaphore rmutex = 1;
semaphore resource = 1;
int readcount = 0;
void reader()
{
while(true)
{
wait(rmutex);
if(readcount == 0)
wait(resource);
readcount++;
signal(rmutex);
......
reading
......
wait(rmutex);
readcount--;
if(readcount == 0)
signal(resource);
signal(rmutex);
}
}
void writer()
{
while(true)
{
wait(resource);
.......
writing;
.......
signal(resource);
}
}
int main()
{
cobegin
reader(); writer();
coend
}
2、公平原则:
semaphore rmutex = 1;
semaphore resource = 1;
semaphore serviceQueue = 1;
int readcount = 0;
void reader()
{
while(true)
{
wait(serviceQueue);
wait(rmutex);
if(readcount == 0)
wait(resource);
readcount++;
signal(rmutex);
signal(serviceQueue);
......
reading
......
wait(rmutex);
readcount--;
if(readcount == 0)
signal(resource);
signal(rmutex);
}
}
void writer()
{
while(true)
{
wait(serviceQueue);
wait(resource);
.......
writing;
.......
signal(resource);
signal(serviceQueue);
}
}
int main()
{
cobegin
reader(); writer();
coend
}
3、写者优先:
semaphore resource = 1;
semaphore wmuter = 1;
semaphore rmutex = 1;
semaphore readTry = 1;
int readcount = 0;
int writercount = 0;
void reader()
{
while(true)
{
wait(readTry);
wait(rmutex);
if(readcount == 0)
wait(resource);
readcount++;
signal(rmutex);
siganal(readTry);
......
reading
......
wait(rmutex);
readcount--;
if(readcount == 0)
signal(resource);
signal(rmutex);
}
}
void writer()
{
while(true)
{
wait(wmutex);
writercount++;
if(writercount == 1)
wait(readTry);
sigal(wmutex);
wait(resource);
.......
writing;
.......
signal(resource);
wait(wmutex);
writercount--;
if(writercount == 0)
signal(readTry);
signal(wmutex);
}
}
int main()
{
cobegin
reader(); writer();
coend
}