[操作系统] - No.1 三种进程间通信:读者优先、写者优先、公平竞争

读者写者也是一个非常著名的互斥问题。读者和写者都可以对文件进行操作。多个读进程可以同时读取文件,但是写进程对文件写操作的时候,其他写进程和读进程都不能操作文件。读写进程有三种情况:读进程优先、写进程优先、读写公平竞争

读进程优先:当有读进程在操作文件的时候,其他读进程无需排队,可以直接对文件进行读操作。写进程需要排队。当有大量的读进程时,写进程会被饿死

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);

}




  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MFC提供了一组同步和同步访问类来解决线程同步问题。其中, 同步对象包括:CSyncObject、CSemaphore、CMutex,CCriticalSection和CEvent; 同步访问对象包括:CMultiLock和CSingleLock。同步类用于访问资源时保证资源的整体性。其中CSyncObject是其他四个同步类的基类,不直接使用。信号同步类CSemaphore通常用于当一个应用程序中同时有多个线程访问一个资源的情况(例如,应用程序允许对同一个Document有多个View);事件同步类CEvent通常用于在应用程序访问资源之前应用程序必须等待的情况(比如,在数据进一个文件之前数据必须从通信端口得到);互斥同步类CMutex和临界区同步类CCriticalSection都是用于保证一个资源一次只能有一个线程访问,二者的不同之处在于前者允许有多个应用程序使用该资源,例如,该资源在一个DLL当中,而后者则不允许对同一个资源的访问超出进程的范畴,而且使用临界区的方式效率比较高。同步访问类用于获得对这些控制资源的访问。CMultiLock和CSingleLock的区别仅在于是需要控制访问多个还是单个资源对象。 信号量对象的构造函数: CSemaphore( LONG lInitialCount = 1, LONG lMaxCount = 1, LPCTSTR pstrName = NULL, LPSECURITY_ATTRIBUTES lpsaAttributes = NULL ); 单锁的构造函数: explicit CSingleLock( CSyncObject* pObject, BOOL bInitialLock = FALSE ); 多锁的构造函数: CMultiLock( CSyncObject* ppObjects[ ], DWORD dwCount, BOOL bInitialLock = FALSE );

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值