多线程读者写者问题--用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();
}

 

posted @ 2018-07-11 21:33  青儿哥哥  阅读(589)  评论(0编辑  收藏  举报