#ifndef MAINWINDOW_H#define MAINWINDOW_H#define M 100#include <ui_mainwindow.h>#include <QMainWindow>#include <QListWidget>#include <thread>#include <QThread>#include <mutex>namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{ Q_OBJECTpublic: explicit MainWindow(QWidget *parent = 0); int Cooking_a() { int food=M; return food; } int Dinner_a(int food) { std::mutex eating; eating.lock(); QThread::msleep(5000); ui->listWidget->addItem(QString::number(food) + " cannibal ate"); food--; eating.unlock(); return 0; } ~MainWindow();private slots: void on_pushButton_clicked(); void on_pushButton_2_clicked();private: Ui::MainWindow *ui;};#endif // MAINWINDOW_H
#include "mainwindow.h"#include "ui_mainwindow.h"#define N 20#define M 100MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this);}MainWindow::~MainWindow(){ delete ui;}void MainWindow::on_pushButton_clicked(){ std::thread Cannibals[N]; while(true) { std::thread cook = std::thread(&MainWindow::Cooking_a, this); cook.join(); int food=Cooking_a(); for(int i=0;i<food;i++) { int coven = M; Cannibals[i] = std::thread(&MainWindow::Dinner_a, this, coven); coven --; Cannibals[i].join(); } }}void MainWindow::on_pushButton_2_clicked(){ exit(0);}
int Dinner_a(int food) { std::mutex eating; eating.lock(); QThread::msleep(5000); ui->listWidget->addItem(QString::number(food) + " cannibal ate"); food--; eating.unlock(); return 0; }
C++ (Qt)bool doEat = true;QAtomicInt numPlum(100); QSemaphore childSemaphore(numPlum);QSemaphore mamaSemaphore; void ChildThread::run( void ){ while (doEat) { childSemaphore.acquire(); if (!doEat) break; if (!numPlum.deref()) mamaSemaphore.release(); }}
C++ (Qt){ QApplication app(...); // Создали тарелку, пока пустую Plate plate; // Маман Mom mom( plate ); // Спиногрызы QList<Child> childs; for( int i = 0; i < MaxChilds; ++i ) childs.append( Child( plate, mom, appetite( i ) ) ); // У каждого ребенка свой аппетит // Киданули им слив plate.putPlum( 100 ); // Запустили симуляцию app.exec();}
C++ (Qt)class Plate{public: explicite Plate() : m_plums( 0 ) {} // Положить слив void putPlums( unsigned int num ) { QMutexLocker lock( &m_mutex ); m_plums += num; } // Если в тарелке сливы есть, то берем одну и возвращаем true // Если тарелка пуста, возвращаем false (по этому признаку, ребенок может звать маму) bool takePlum() { QMutexLocker lock( &m_mutex ); if( !m_plums ) return false; --m_plums; return true; } private: unsigned int m_plums; QMutex m_mutex;};
C++ (Qt) // Маман Mom mom( plate ); // Спиногрызы QList<Child> childs; for( int i = 0; i < MaxChilds; ++i ) childs.append( Child( plate, mom, appetite( i ) ) ); // У каждого ребенка свой аппетит // Киданули им слив plate.putPlum( 100 ); // Запустили симуляцию app.exec();}
C++ (Qt) QApplication app(...); // Мама Mom mom(); // Дети QVector <Child *> childs; for( int i = 0; i < MaxChilds; ++i ) childs.append(new Child(...)); // запускаем mom.start(); for( int i = 0; i < MaxChilds; ++i ) childs[i]->start(); // UI SetupUI(); app.exec(); // ждем пока все нитки выйдут mom.wait(); for( int i = 0; i < MaxChilds; ++i ) childs[i]->wait(); // печатаем статистику PrintStat(); // удаляем отработавшие нитки qDeleteAll(childs.begin(), childs.end());