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;
    }
    
  • 相关阅读:
    难以捉摸?机器学习模型的可解释性初探
    什么是边缘计算?它将如何补充5G?
    2021年将会成为主流的四个云计算技术
    中国SaaS这个局,AI能破吗?
    边缘计算点燃新风暴,IT与OT之战一触即发
    为什么保护云安全是一个数学问题
    物联网中的热门IT技能
    2021 区块链及数字货币9大展望
    边缘计算将取代云计算?5G时代的最强黑马出现了吗?
    2021年区块链十大发展趋势:那些偶然中的必然
  • 原文地址:https://www.cnblogs.com/svitter/p/4005988.html
Copyright © 2011-2022 走看看