读者写者也是一个非常著名的互斥问题。读者和写者都可以对文件进行操作。多个读进程可以同时读取文件,但是写进程对文件写操作的时候,其他写进程和读进程都不能操作文件。读写进程有三种情况:读进程优先、写进程优先、读写公平竞争
读进程优先:当有读进程在操作文件的时候,其他读进程无需排队,可以直接对文件进行读操作。写进程需要排队。当有大量的读进程时,写进程会被饿死
int rcnt = 0;
semaphore fmutex=1, rcntmutex=1;
void reader()
{
P(rcntmutex);
if(rcnt == 0)
P(fmutex);
rcnt = rcnt + 1;
V(rcntmutex)
// Operation.
P(rcntmutex)
rcnt = rcnt - 1;
if(rcnt == 0)
V(fmutex)
V(rcntmutex);
}
void writer()
{
P(fmutex);
// Operation
V(fmutex);
}
写进程优先:当有写进程在操作文件的时候,写进程和写进程一起无需排队,只需要等待里面的写进程释放文件即可。写进程需要进行排队。当有大量的写进程时,读进程会被饿死。
int rcnt = 0,wcnt = 0;
semaphore fmutex=1, rcntmutex=1,wcntmutex = 1,queue = 1;
void reader()
{
P(queue);
P(rcntmutex);
if(rcnt == 0)
P(fmutex);
rcnt = rcnt + 1;
V(rcntmutex);
V(queue);
// Operation
P(rcntmutex);
rcnt = rcnt - 1;
if(rcnt == 0)
V(fmutex);
V(rcntmutex);
}
void writer()
{
P(wcntmutex);
if(wcnt == 0)
P(queue);
wcnt = wcnt + 1;
V(wcntmutex);
P(fmutex);
// Operation
V(fmutex);
P(wcntmutex);
wcnt = wcnt - 1;
if(wcnt == 0)
V(queue);
V(wcntmutex);
}
公平竞争:读写进程都要排队进行操作文件。即使里面有读进程在操作文件,读进程也要和写进程一起排队。
int rcnt = 0;
semaphore fmutex=1, rcntmutex=1,queue = 1;
void reader()
{
P(queue);
P(rcntmutex);
if(rcnt == 0)
P(fmutex);
rcnt = rcnt + 1;
V(rcntmutex);
V(queue);
//Operation
P(rcntmutex);
rcnt = rcnt - 1;
if(rcnt == 0)
V(fmutex);
V(rcntmutex);
}
void writer()
{
P(queue);
P(fmutex);
V(queue);
// Operation
V(fmutex);
}