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;
    }
    
  • 相关阅读:
    phpcms后台进入地址(包含No permission resources错误)
    phpmyadmin上传大sql文件办法
    ubuntu彻底卸载mysql
    Hdoj 2602.Bone Collector 题解
    一篇看懂词向量
    Hdoj 1905.Pseudoprime numbers 题解
    The Python Challenge 谜题全解(持续更新)
    Hdoj 2289.Cup 题解
    Hdoj 2899.Strange fuction 题解
    Hdoj 2199.Can you solve this equation? 题解
  • 原文地址:https://www.cnblogs.com/svitter/p/4005988.html
Copyright © 2011-2022 走看看