zoukankan      html  css  js  c++  java
  • 【Qt入门实践】Qt之哲学家问题(linux 多线程)

    转载请注明出处:http://blog.csdn.net/feng1790291543


    linux多线程实现哲学家问题,依据哲学家吃饭、拿筷子、放下筷子......


    首先,主线程使用Qt下的GUI的简单一个button控制即可了

    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;
    }
    

    maindesttop.h

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

    线程4头文件:

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

    线程5头文件:

    #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

  • 相关阅读:
    第五章 Python——字符编码与文件处理
    第六章 Python——函数与面向过程编程
    第七章 Python——模块与包
    第一章 计算机硬件基础与操作系统介绍
    luogu P1706 全排列问题
    luogu 2142 高精度减法
    luogu P1601 高精度加法
    luogu P1803 线段覆盖 贪心
    luogu P1031 均分纸牌 贪心
    luogu P2678 跳石头 二分答案
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6991963.html
Copyright © 2011-2022 走看看