zoukankan      html  css  js  c++  java
  • 多线程读者写者问题--用QT实现

    先把代码贴上来,有时间再整理吧。。因为工作中用Qt,所以用Qt实现的。。。。刚上班,,忙!

    三种方法,读者优先,写者优先和公平竞争。。

    读者优先

    #include <QCoreApplication>
    #include <QThread>
    #include <iostream>
    #include <QMutex>
    #include <QTime>
    #include <QtGlobal>
    using namespace std;
    
    int buffer;//临界资源
    QMutex bMutex;
    
    
    
    class Reader:public QThread{
    private:
        static int readerCount;
        static QMutex rdcnMutex;
        static QMutex printMutex;
    public:
        void read(){
            cout<<"读者读出:"<<buffer<<endl;
        }
    protected:
        void run(){
            rdcnMutex.lock();
            if(readerCount == 0){
                bMutex.lock();
            }
            readerCount++;
            rdcnMutex.unlock();
    
            printMutex.lock();
            sleep(1);
            read();
            printMutex.unlock();
    
    
            rdcnMutex.lock();
            readerCount--;
            if(readerCount == 0){
                bMutex.unlock();
            }
            rdcnMutex.unlock();
        }
    };
    
    int Reader::readerCount = 0;
    QMutex Reader::rdcnMutex;
    QMutex Reader::printMutex;
    
    class Writer:public QThread{
    public:
        void write(){
            qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
            buffer = qrand() % 100;
            cout<<"写者写入:"<<buffer<<endl;
        }
    protected:
        void run(){
            bMutex.lock();
            sleep(1);
            write();
            bMutex.unlock();
        }
    };
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        buffer = -1;
        const int count = 10;
        Writer writer[count];
        Reader reader[count];
        for(int i = 0; i < count; i++ ){
            writer[i].start();
            reader[i].start();
        }
        for(int i = 0; i < count; i++ ){
            writer[i].wait();
            reader[i].wait();
        }
    
    
        return a.exec();
    }

    写者优先:

    #include <QCoreApplication>
    #include <QMutex>
    #include <QtGlobal>
    #include <QThread>
    #include <iostream>
    #include <QtGlobal>
    #include <QTime>
    using namespace std;
    
    int buffer;//临界资源
    QMutex bMutex;
    QMutex queueMutex;
    
    
    class Reader: public QThread{
    private:
        static int readerCount;
        static QMutex rdcnMutex;
        static QMutex printMutex;
    public:
        void read(){
            printMutex.lock();
            cout<<"读者读出:"<<buffer<<endl;
            printMutex.unlock();
        }
    protected:
        void run(){
            queueMutex.lock();
            rdcnMutex.lock();
            if(readerCount == 0){
                bMutex.lock();
            }
            readerCount++;
            rdcnMutex.unlock();
            queueMutex.unlock();
    
            sleep(1);
            read();
    
            rdcnMutex.lock();
            readerCount--;
            if(readerCount == 0){
                bMutex.unlock();
            }
            rdcnMutex.unlock();
        }
    };
    int Reader::readerCount = 0;
    QMutex Reader::rdcnMutex;
    QMutex Reader::printMutex;
    
    
    class Writer: public QThread{
    private:
        static int writerCount;
        static QMutex wtcnMutex;
    public:
        void write(){
            qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
            buffer = qrand() % 100;
            cout<<"写者写入:"<<buffer<<endl;
        }
    protected:
        void run(){
            wtcnMutex.lock();
            if(writerCount == 0){
                queueMutex.lock();
            }
            writerCount++;
            wtcnMutex.unlock();
    
            bMutex.lock();
            sleep(1);
            write();
            bMutex.unlock();
    
            wtcnMutex.lock();
            writerCount--;
            if(writerCount == 0){
                queueMutex.unlock();
            }
            wtcnMutex.unlock();
        }
    
    };
    int Writer::writerCount = 0;
    QMutex Writer::wtcnMutex;
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        buffer = -1;
        const int count = 10;
        Writer writer[count];
        Reader reader[count];
        for(int i = 0; i < count; i++ ){
            writer[i].start();
            reader[i].start();
        }
        for(int i = 0; i < count; i++ ){
            writer[i].wait();
            reader[i].wait();
        }
    
        return a.exec();
    }

    公平竞争

    #include <QCoreApplication>
    #include <QMutex>
    #include <QtGlobal>
    #include <QThread>
    #include <iostream>
    #include <QtGlobal>
    #include <QTime>
    using namespace std;
    
    
    int buffer;//临界资源
    QMutex bMutex;
    QMutex queueMutex;
    
    class Reader: public QThread{
    private:
        static int readerCount;
        static QMutex rdcnMutex;
        static QMutex printMutex;
    public:
        void read(){
            printMutex.lock();
            cout<<"读者读出:"<<buffer<<endl;
            printMutex.unlock();
        }
    protected:
        void run(){
            queueMutex.lock();
            rdcnMutex.lock();
            if(readerCount == 0){
                bMutex.lock();
            }
            readerCount++;
            rdcnMutex.unlock();
            queueMutex.unlock();
    
            sleep(1);
            read();
    
            rdcnMutex.lock();
            readerCount--;
            if(readerCount == 0){
                bMutex.unlock();
            }
            rdcnMutex.unlock();
        }
    };
    int Reader::readerCount = 0;
    QMutex Reader::rdcnMutex;
    QMutex Reader::printMutex;
    
    class Writer: public QThread{
    private:
    public:
        void write(){
            qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
            buffer = qrand() % 100;
            cout<<"写者写入:"<<buffer<<endl;
        }
    protected:
        void run(){
            queueMutex.lock();
            bMutex.lock();
            queueMutex.unlock();
            sleep(1);
            write();
            bMutex.unlock();
    
        }
    
    };
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        buffer = -1;
        const int count = 10;
        Writer writer[count];
        Reader reader[count];
        for(int i = 0; i < count; i++ ){
            writer[i].start();
            reader[i].start();
        }
        for(int i = 0; i < count; i++ ){
            writer[i].wait();
            reader[i].wait();
        }
        return a.exec();
    }
  • 相关阅读:
    Entity Framework 4 in Action读书笔记——第七章:持久化对象到数据库:使用SaveChanges持久化实体
    ASP.NET MVC+Colorbox做的一个Demo(一)
    Entity Framework 4 in Action读书笔记——第七章:持久化对象到数据库:持久化的一些技巧
    NHibernate初学者指南(4):定义数据库架构
    Entity Framework 4 in Action读书笔记——第六章:理解实体的生命周期(三)
    NHibernate初学者指南(1):开篇
    Entity Framework 4 in Action读书笔记——第七章:持久化对象到数据库:持久化修改的实体到数据库
    Java面试题每日五题(2010/02/26)
    Notes for Hadoop the definitive guide
    简明Java笔记
  • 原文地址:https://www.cnblogs.com/qingergege/p/9296803.html
Copyright © 2011-2022 走看看