多線程讀者寫者問題--用QT實現

先把代碼貼上來,有時間再整理吧。。由於工做中用Qt,因此用Qt實現的。。。。剛上班,,忙!ios

三種方法,讀者優先,寫者優先和公平競爭。。spa

 

讀者優先code

#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();
}

 

寫者優先:blog

#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();
}
相關文章
相關標籤/搜索