Qt使用信号量QSemaphore库实现线程间交互

QSemaphore 是 Qt 框架中用于线程间同步的类。它可以用于控制对共享资源的访问,以避免多个线程同时访问同一资源而导致的问题。以下是一个使用 QSemaphore 的简单示例,说明如何在线程间实现交互:

示例:生产者-消费者问题

假设有两个线程:一个生产者线程和一个消费者线程。生产者线程生成数据,而消费者线程消费这些数据。我们使用一个队列来存储这些数据,并使用 QSemaphore 来控制对队列的访问。

定义共享资源:我们有一个队列(例如,使用 QQueue)用于存储数据。

定义信号量:使用 QSemaphore 来控制对队列的访问。例如,我们有一个信号量用于控制生产者线程向队列中添加数据,另一个信号量用于控制消费者线程从队列中取出数据。

实现线程:

生产者线程:生成数据,等待信号量允许,将数据放入队列,然后释放信号量。
消费者线程:等待信号量允许,从队列中取出数据,处理数据,然后释放信号量。
代码示例

下面是一个简单的示例代码:

#include <QCoreApplication>
#include <QQueue>
#include <QSemaphore>
#include <QThread>
#include <QDebug>

// 共享资源 - 队列
QQueue<int> dataQueue;
// 控制向队列添加数据的信号量
QSemaphore addSemaphore(1); // 初始化为1,允许一个线程进入临界区
// 控制从队列中取出数据的信号量
QSemaphore removeSemaphore(0); // 初始化为0,阻止任何线程进入临界区

class Producer : public QThread {
protected:
    void run() override {
        for (int i = 0; i < 5; ++i) {
            addSemaphore.acquire(); // 等待允许向队列添加数据
            dataQueue.enqueue(i); // 添加数据到队列
            qDebug() << "Producer added:" << i;
            removeSemaphore.release(); // 允许一个线程从队列中取出数据
        }
    }
};

class Consumer : public QThread {
protected:
    void run() override {
        while (!dataQueue.isEmpty()) {
            removeSemaphore.acquire(); // 等待允许从队列中取出数据
            int value = dataQueue.dequeue(); // 从队列中取出数据
            qDebug() << "Consumer consumed:" << value;
            addSemaphore.release(); // 允许一个线程向队列添加数据
        }
    }
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    Producer producer;
    Consumer consumer;
    producer.start();
    consumer.start();
    producer.wait();
    consumer.wait();
    return a.exec();
}

这个例子中,生产者和消费者通过 QSemaphore 实现了同步,确保了数据的安全生产和消费。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值