读者-写者问题Qt 解

发布时间 2023-05-24 08:49:35作者: 愿得入睡
#include <QCoreApplication>
#include <QThread>
#include <QDebug>
#include <QMutex>
#include <QWaitCondition>

QMutex mutex;
QWaitCondition readCondition;
QWaitCondition writeCondition;

int resource = 0;
int readerCount = 0;
bool writing = false;

class Reader : public QThread
{
public:
    void run()
    {
        while (true) {
            mutex.lock();
            while (writing) {
                readCondition.wait(&mutex);
            }
            ++readerCount;
            mutex.unlock();

            // 读取共享资源
            qDebug() << "Reader" << QThread::currentThreadId() << "reads resource" << resource;

            mutex.lock();
            --readerCount;
            if (readerCount == 0) {
                writeCondition.wakeOne();
            }
            mutex.unlock();

            msleep(1000);
        }
    }
};

class Writer : public QThread
{
public:
    void run()
    {
        while (true) {
            mutex.lock();
            while (writing || readerCount > 0) {
                writeCondition.wait(&mutex);
            }
            writing = true;
            mutex.unlock();

            // 写入共享资源
            ++resource;
            qDebug() << "Writer" << QThread::currentThreadId() << "writes resource" << resource;

            mutex.lock();
            writing = false;
            readCondition.wakeAll();
            writeCondition.wakeOne();
            mutex.unlock();

            msleep(2000);
        }
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Reader reader1, reader2;
    Writer writer;

    reader1.start();
    reader2.start();
    writer.start();

    return a.exec();
}