条件变量和 互斥量实现 数据互斥访问



```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`用于线程之间的等待和通知机制,使消费者线程能够在没有数据可消费时进入等待状态,并在生产者线程通知时恢复执行。

注意:上述示例为了简化代码,直接使用全局变量和全局锁,实际应用中应根据需要设计合适的数据结构和锁的范围,以避免潜在的线程安全问题。


posted @ 2023-05-22 14:07  愿得入睡  阅读(53)  评论(0)    收藏  举报