// main.cpp
#include <QtCore/QCoreApplication>
#include <qthread.h>
#include <qthreadpool.h>
#include <qmutex.h>
#include <qdebug.h>
#include "worker.h"
#include "Counter.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Counter counter;
QMutex mutex; (QMutex::Recursive);
QThreadPool* pool = QThreadPool::globalInstance();
qInfo() << "Count: " << counter.count();
for (int i = 0; i < pool->maxThreadCount();i++) {
worker* w = new worker(&a, &counter, &mutex);
w->setAutoDelete(true);
pool->start(w);
}
pool->waitForDone();
qInfo() << "Done, the count is: " << counter.count();
return a.exec();
}
// Counter.h
#pragma once
#include <QObject>
#include <qdebug.h>
class Counter : public QObject
{
Q_OBJECT
public:
explicit Counter(QObject *parent = nullptr);
~Counter();
void increment();
void decrement();
int count();
signals:
public slots:
private:
int value = 0;
};
// Counter.cpp
#include "Counter.h"
Counter::Counter(QObject *parent)
: QObject(parent)
{
}
Counter::~Counter()
{
}
void Counter::increment()
{
value++;
}
void Counter::decrement()
{
value--;
}
int Counter::count()
{
return value;
}
// worker.h
#pragma once
#include <QObject>
#include <qthread.h>
#include <qrunnable.h>
#include <qdebug.h>
#include <qrandom.h>
#include <qmutex.h>
#include "Counter.h"
class worker : public QObject, public QRunnable
{
Q_OBJECT
public:
explicit worker(QObject *parent = nullptr, Counter* counter = nullptr, QMutex* mutex = nullptr);
void run();
signals:
public slots:
private:
Counter* counter;
QMutex* mutex;
};
// worker.cpp
#include "worker.h"
worker::worker(QObject* parent, Counter* counter, QMutex* mutex) : QObject(parent), QRunnable()
{
this->counter = counter;
this->mutex = mutex;
}
void worker::run()
{
if (!counter) return;
qInfo() << this << " Starting";
for (int i = 0; i < 100; i++) {
// Without our mutex, the count is wildy out of control
// Only lock for short term durations:
QMutexLocker locker(mutex);
counter->increment();
qInfo() << this << " Count: " << counter->count();
counter->decrement();
}
qInfo() << this << " Finished";
}
