读者-写者问题Qt 解
发布时间 2023-05-24 08:49:35作者: 愿得入睡
#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();
}