zoukankan      html  css  js  c++  java
  • 操作系统同步互斥经典问题——读者写者问题

    读者优先

    #include <iostream>
    #include <mutex>
    #include <thread>
    
    using namespace std;
    
    mutex mt, wsem;
    int readcount = 0;
    #define READ(a) cout << a << " is reading..." << endl;
    #define FINISH(a) cout << a << " finished reading." << endl;
    #define WRITE cout << "writing..." << endl;
    
    void P(mutex &mt)
    {
        mt.lock();
    }
    
    void V(mutex &mt)
    {
        mt.unlock();
    }
    
    // 加入unistd.h出现问题,似乎与thread的兼容性比较差,于是重写
    void delay()
    {
        int sum=0;
        for(int i = 0; i < 10000000; i++)
            sum += i
    }
    
    void read(string a)
    {
        for(int i = 0; i < 3; i++)
        {
            P(mt);
            readcount++;
            if(readcount == 1)
                P(wsem);
            V(mt);
            READ(a);
            delay();
            P(mt);
            readcount--;
            FINISH(a);
            if(readcount == 0)
                V(wsem);
            V(mt);
        }
    }
    
    void write()
    {
        for(int i = 0; i < 5; i++)
        {
            P(wsem);
            WRITE;
            delay();
            V(wsem);
        }
    }
    
    int main()
    {
        thread reader1(read, "svtter");
        thread reader2(read, "sr");
        thread reader3(read, "yym");
        thread reader4(read, "xiaoniu");
        thread writer(write);
    
        reader1.join();
        reader2.join();
        reader3.join();
        reader4.join();
        writer.join();
    
        return 0;
    }
    

    写者优先

    使rsem中只有一个读者在等待,保证了如果有写者,写者优先写。

    #include <iostream>
    #include <mutex>
    #include <thread>
    
    using namespace std;
    
    #define READ(a,i) cout << a << i<<" is reading..." << endl;
    #define FINR(a,i) cout << a << i<<" finished reading." << endl;
    #define WRITE(a,i) cout << a <<i<<" is writing..." << endl;
    #define FINW(a, i) cout << a <<i<<" finished writing..." << endl;
    
    void P(mutex &mt)
    {
        mt.lock();
    }
    
    void V(mutex &mt)
    {
        mt.unlock();
    }
    
    // 加入unistd.h出现问题,似乎与thread的兼容性比较差,于是重写
    void delay()
    {
        int sum=0;
        for(int i = 0; i < 10000000; i++)
            sum += i;
    }
    
    
    mutex mr, wsem, rsem, mrc, mwc;
    int readcount = 0;
    int writecount = 0;
    
    void read(string a)
    {
        for(int i = 0; i < 5; i++)
        {
            P(mr);
            P(rsem);
            P(mrc);
            readcount++;
            if(readcount == 1)
                P(wsem);
            V(mrc);
            V(rsem);
            V(mr);
            READ(a, i);
            P(mrc);
            FINR(a, i);
            readcount--;
            if(readcount == 0)
                V(wsem);
            V(mrc);
        }
    }
    
    void write(string a)
    {
        for(int i = 0; i < 3; i++)
        {
            P(mwc);
            writecount++;
            if(writecount == 1)
                P(rsem);
            V(mwc);
            P(wsem);
            WRITE(a, i);
            FINW(a, i);
            V(wsem);
            P(mwc);
            writecount--;
            if(writecount == 0)
                V(rsem);
            V(mwc);
        }
    }
    
    int main()
    {
        thread reader1(read, "svtter");
        thread writer1(write, "sr");
        thread writer2(write, "zs");
        thread writer3(write, "yym");
    
        reader1.join();
        writer1.join();
        writer2.join();
        writer3.join();
    
        return 0;
    }
    
  • 相关阅读:
    Mac OSX下增加TCP连接数
    Connection reset by peer的常见原因及解决办法
    修改主机名
    docker 查看 docker容器启动 完整命令
    nginx 日志打印响应时间 request_time 和 upstream_response_time
    Ubuntu16.04 安装 Docker
    VictoriaMetrics vmagent 使用
    VictoriaMetrics vmauth 使用
    VictoriaMetrics集群模式的一些说明
    promgen prometheus 配置文件生成工具
  • 原文地址:https://www.cnblogs.com/svitter/p/4005988.html
Copyright © 2011-2022 走看看