条件变量和 互斥量实现 数据互斥访问
```cpp
#include <QCoreApplication>
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
#include <QDebug>
QMutex mutex;
QWaitCondition condition;
bool dataReady = false;
class Producer : public QThread
{
public:
void run() override
{
// 模拟生产数据的过程
for (int i = 1; i <= 5; ++i)
{
sleep(1);
// 加锁
QMutexLocker locker(&mutex);
// 设置数据
dataReady = true;
qDebug() << "Producer: Data produced.";
// 通知等待的线程
condition.wakeAll();
}
}
};
class Consumer : public QThread
{
public:
void run() override
{
// 模拟消费数据的过程
for (int i = 1; i <= 5; ++i)
{
// 加锁
QMutexLocker locker(&mutex);
// 检查数据是否准备好
if (!dataReady)
{
qDebug() << "Consumer: Waiting for data...";
condition.wait(&mutex);
}
// 处理数据
qDebug() << "Consumer: Data consumed.";
dataReady = false;
}
}
};
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
Producer producer;
Consumer consumer;
// 启动生产者和消费者线程
producer.start();
consumer.start();
// 等待线程执行完成
producer.wait();
consumer.wait();
return 0;
}
```
在上面的示例中,`Producer`类和`Consumer`类分别是生产者和消费者线程的实现。生产者线程负责生产数据并通过`QWaitCondition`通知消费者线程。消费者线程在没有数据可消费时等待`QWaitCondition`的通知,并在收到通知后处理数据。
使用`QMutex`实现对共享数据的互斥访问,确保生产者和消费者线程之间的数据同步和互斥访问。`QWaitCondition`用于线程之间的等待和通知机制,使消费者线程能够在没有数据可消费时进入等待状态,并在生产者线程通知时恢复执行。
注意:上述示例为了简化代码,直接使用全局变量和全局锁,实际应用中应根据需要设计合适的数据结构和锁的范围,以避免潜在的线程安全问题。

浙公网安备 33010602011771号