先把代碼貼上來,有時間再整理吧。。由於工做中用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(); }