转载请注明出处:http://blog.csdn.net/feng1790291543
linux多线程实现哲学家问题,根据哲学家吃饭、拿筷子、放下筷子......
首先,主线程使用Qt下的GUI的简单一个按钮控制就行了
maindesttop.cpp
#include "maindesttop.h" #include "ui_maindesttop.h" QMutex mutex01; QMutex mutex02; QMutex mutex03; QMutex mutex04; QMutex mutex05; int n1=1; int n2=1; int n3=1; int n4=1; int n5=1; QWaitCondition waitcondition001; QWaitCondition waitcondition002; QWaitCondition waitcondition003; QWaitCondition waitcondition004; QWaitCondition waitcondition005; MainDestTop::MainDestTop(QWidget *parent) : QWidget(parent), ui(new Ui::MainDestTop) { ui->setupUi(this); } MainDestTop::~MainDestTop() { delete ui; } void MainDestTop::on_pushButtonStart_clicked() { pro001=new Proferssor001; pro002=new Professor002; pro003=new Professor003; pro004=new Professor004; pro005=new Professor005; pro001->start(); pro002->start(); pro003->start(); pro004->start(); pro005->start(); return ; } void MainDestTop::StopThread() { pro001->quit(); pro001->wait(); pro001->deleteLater(); delete pro001; pro001=NULL; pro002->quit(); pro002->wait(); pro002->deleteLater(); delete pro002; pro002=NULL; pro003->quit(); pro003->wait(); pro003->deleteLater(); delete pro003; pro003=NULL; pro004->quit(); pro004->wait(); pro004->deleteLater(); delete pro004; pro004=NULL; pro005- >quit(); pro005->wait(); pro005->deleteLater(); delete pro005; pro005=NULL; }
#ifndef MAINDESTTOP_H #define MAINDESTTOP_H #include <QtGui/QWidget> #include <QtCore> #include <QMutex> #include "proferssor001.h" #include "professor002.h" #include "professor003.h" #include "professor004.h" #include "professor005.h" namespace Ui { class MainDestTop; } class MainDestTop : public QWidget { Q_OBJECT public: MainDestTop(QWidget *parent = 0); ~MainDestTop(); void StopThread(); private: Ui::MainDestTop *ui; Proferssor001 *pro001; Professor002 *pro002; Professor003 *pro003; Professor004 *pro004; Professor005 *pro005; private slots: void on_pushButtonStart_clicked(); }; #endif // MAINDESTTOP_H
其次,子线程源码如下:
#ifndef PROFERSSOR001_H #define PROFERSSOR001_H #include <QThread> #include <QtCore> class Proferssor001 : public QThread { public: Proferssor001(); void run(); }; #endif // PROFERSSOR001_H
#include "proferssor001.h" /**************** proferssor001---->A proferssor002---->B proferssor003--->C proferssor004---->D proferssor005---->E 资源夺取: A--->1/5 B--->2/1 C--->3/2 D--->4/3 E--->5/4 ******************/ extern QMutex mutex01; extern QMutex mutex02; extern QMutex mutex03; extern QMutex mutex04; extern QMutex mutex05; extern int n1; extern int n2; extern int n3; extern int n4; extern int n5; extern QWaitCondition waitcondition001; extern QWaitCondition waitcondition002; extern QWaitCondition waitcondition003; extern QWaitCondition waitcondition004; extern QWaitCondition waitcondition005; Proferssor001::Proferssor001() { } void Proferssor001::run() { while(1) { mutex01.lock(); mutex05.lock(); while((n1+n5)<2) { mutex05.unlock(); qDebug()<<"proferssor001哲学家没左边筷子~"; mutex01.unlock(); qDebug()<<"proferssor001哲学家没右边筷子~"; qDebug()<<"proferssor001$$$$$$$$$$哲学家开始休息...."; waitcondition001.wait(&mutex01); waitcondition005.wait(&mutex05); continue ; } qDebug()<<"proferssor001$$$$$$$$$$哲学家开始吃饭~"; n1--; n5--; mutex05.unlock(); n5=(n5+1); qDebug()<<"proferssor001$$$$$$$$$$哲学家放下左边筷子~"; msleep(2); mutex01.unlock(); n1=(n1+1); qDebug()<<"proferssor001$$$$$$$$$$哲学家放下右边筷子~"; msleep(2); } return ; }
#ifndef PROFESSOR002_H #define PROFESSOR002_H #include <QThread> #include <QtCore> class Professor002 : public QThread { public: Professor002(); void run(); }; #endif // PROFESSOR002_H
#include "professor002.h" /**************** proferssor001---->A proferssor002---->B proferssor003--->C proferssor004---->D proferssor005---->E 资源夺取: A--->1/5 B--->2/1 C--->3/2 D--->4/3 E--->5/4 ******************/ extern QMutex mutex01; extern QMutex mutex02; extern QMutex mutex03; extern QMutex mutex04; extern QMutex mutex05; extern int n1; extern int n2; extern int n3; extern int n4; extern int n5; extern QWaitCondition waitcondition001; extern QWaitCondition waitcondition002; extern QWaitCondition waitcondition003; extern QWaitCondition waitcondition004; extern QWaitCondition waitcondition005; Professor002::Professor002() { } void Professor002::run() { while(1) { mutex02.lock(); mutex01.lock(); while((n1+n2)<2) { mutex01.unlock(); qDebug()<<"proferssor002哲学家没左边筷子~"; mutex02.unlock(); qDebug()<<"proferssor002哲学家没右边筷子~"; qDebug()<<"proferssor002&&&&&&&&&哲学家开始休息...."; waitcondition002.wait(&mutex02); waitcondition001.wait(&mutex01); continue ; } qDebug()<<"proferssor002&&&&&&&&&哲学家开始吃饭~"; n1--; n2--; mutex01.unlock(); n1=(n1+1); qDebug()<<"proferssor002&&&&&&&&&哲学家放下左边筷子~"; msleep(2); mutex02.unlock(); n2=(n2+1); qDebug()<<"proferssor002&&&&&&&&&哲学家放下右边筷子~"; msleep(2); } return ; }
#ifndef PROFESSOR003_H #define PROFESSOR003_H #include <QThread> #include <QtCore> class Professor003 : public QThread { public: Professor003(); void run(); }; #endif // PROFESSOR003_H
#include "professor003.h" /**************** proferssor001---->A proferssor002---->B proferssor003--->C proferssor004---->D proferssor005---->E 资源夺取: A--->1/5 B--->2/1 C--->3/2 D--->4/3 E--->5/4 ******************/ extern QMutex mutex01; extern QMutex mutex02; extern QMutex mutex03; extern QMutex mutex04; extern QMutex mutex05; extern int n1; extern int n2; extern int n3; extern int n4; extern int n5; extern QWaitCondition waitcondition001; extern QWaitCondition waitcondition002; extern QWaitCondition waitcondition003; extern QWaitCondition waitcondition004; extern QWaitCondition waitcondition005; Professor003::Professor003() { } void Professor003::run() { while(1) { mutex03.lock(); mutex02.lock(); while((n2+n3)<2) { mutex02.unlock(); qDebug()<<"proferssor003哲学家没左边筷子~"; mutex03.unlock(); qDebug()<<"proferssor003哲学家没右边筷子~"; qDebug()<<"proferssor003******哲学家开始休息...."; waitcondition003.wait(&mutex03); waitcondition002.wait(&mutex02); continue ; } qDebug()<<"proferssor003******哲学家开始吃饭~"; n2--; n3--; mutex02.unlock(); n2=(n2+1); qDebug()<<"proferssor003******哲学家放下左边筷子~"; msleep(2); mutex03.unlock(); n3=(n3+1); qDebug()<<"proferssor003******哲学家放下右边筷子~"; msleep(2); } return ; }
#ifndef PROFESSOR004_H #define PROFESSOR004_H #include <QThread> #include <QtCore> class Professor004 : public QThread { public: Professor004(); void run(); }; #endif // PROFESSOR004_H
#include "professor004.h" /**************** proferssor001---->A proferssor002---->B proferssor003--->C proferssor004---->D proferssor005---->E 资源夺取: A--->1/5 B--->2/1 C--->3/2 D--->4/3 E--->5/4 ******************/ extern QMutex mutex01; extern QMutex mutex02; extern QMutex mutex03; extern QMutex mutex04; extern QMutex mutex05; extern int n1; extern int n2; extern int n3; extern int n4; extern int n5; extern QWaitCondition waitcondition001; extern QWaitCondition waitcondition002; extern QWaitCondition waitcondition003; extern QWaitCondition waitcondition004; extern QWaitCondition waitcondition005; Professor004::Professor004() { } void Professor004::run() { while(1) { mutex04.lock(); mutex03.lock(); while((n4+n3)<2) { mutex03.unlock(); qDebug()<<"proferssor004哲学家没左边筷子~"; mutex04.unlock(); qDebug()<<"proferssor004哲学家没右边筷子~"; qDebug()<<"proferssor004----哲学家开始休息...."; waitcondition004.wait(&mutex04); waitcondition003.wait(&mutex03); continue ; } qDebug()<<"proferssor004----哲学家开始吃饭~"; n3--; n4--; mutex03.unlock(); n3=(n3+1); qDebug()<<"proferssor004----哲学家放下左边筷子~"; msleep(2); mutex04.unlock(); n4=(n4+1); qDebug()<<"proferssor004----哲学家放下右边筷子~"; msleep(2); } return ; }
#ifndef PROFESSOR005_H #define PROFESSOR005_H #include <QThread> #include <QtCore> class Professor005 : public QThread { public: Professor005(); void run(); }; #endif // PROFESSOR005_H
#include "professor005.h" /**************** proferssor001---->A proferssor002---->B proferssor003--->C proferssor004---->D proferssor005---->E 资源夺取: A--->1/5 B--->2/1 C--->3/2 D--->4/3 E--->5/4 ******************/ extern QMutex mutex01; extern QMutex mutex02; extern QMutex mutex03; extern QMutex mutex04; extern QMutex mutex05; extern int n1; extern int n2; extern int n3; extern int n4; extern int n5; extern QWaitCondition waitcondition001; extern QWaitCondition waitcondition002; extern QWaitCondition waitcondition003; extern QWaitCondition waitcondition004; extern QWaitCondition waitcondition005; Professor005::Professor005() { } void Professor005::run() { while(1) { mutex05.lock(); mutex04.lock(); while((n4+n5)<2) { mutex04.unlock(); qDebug()<<"proferssor005哲学家没左边筷子~"; mutex05.unlock(); qDebug()<<"proferssor005哲学家没右边筷子~"; qDebug()<<"proferssor005====哲学家开始休息...."; waitcondition005.wait(&mutex05); waitcondition004.wait(&mutex04); continue ; } qDebug()<<"proferssor005====哲学家开始吃饭~"; n4--; n5--; mutex04.unlock(); n4=(n4+1); qDebug()<<"proferssor005====哲学家放下左边筷子~"; msleep(2); mutex05.unlock(); n5=(n5+1); qDebug()<<"proferssor005====哲学家放下右边筷子~"; msleep(2); } return ; }
运行结果:
资源免费下载:http://download.csdn.net/detail/feng1790291543/7324039
Qt之哲学家问题(linux 多线程),布布扣,bubuko.com
原文地址:http://blog.csdn.net/feng1790291543/article/details/25426921