用QT写一个生产者消费者示例代码
时间: 2023-09-03 17:16:34 浏览: 89
这里是一个使用Qt编写的生产者消费者示例代码:
```cpp
#include <QCoreApplication>
#include <QThread>
#include <QDebug>
#include <QSemaphore>
const int BUFFER_SIZE = 5; // 缓冲区大小
// 生产者
class Producer : public QThread
{
public:
Producer(QSemaphore& empty, QSemaphore& full, QSemaphore& mutex, int* buffer)
: empty(empty), full(full), mutex(mutex), buffer(buffer)
{
}
protected:
void run() override
{
for (int i = 0; i < BUFFER_SIZE; ++i) {
empty.acquire(); // 等待缓冲区空闲
mutex.acquire(); // 获取互斥锁
buffer[i] = i + 1; // 生产一个数据
qDebug() << "Producer produced: " << buffer[i];
mutex.release(); // 释放互斥锁
full.release(); // 通知消费者缓冲区已经有数据了
}
}
private:
QSemaphore& empty; // 缓冲区空闲的信号量
QSemaphore& full; // 缓冲区满的信号量
QSemaphore& mutex; // 互斥锁
int* buffer; // 缓冲区
};
// 消费者
class Consumer : public QThread
{
public:
Consumer(QSemaphore& empty, QSemaphore& full, QSemaphore& mutex, int* buffer)
: empty(empty), full(full), mutex(mutex), buffer(buffer)
{
}
protected:
void run() override
{
for (int i = 0; i < BUFFER_SIZE; ++i) {
full.acquire(); // 等待缓冲区有数据
mutex.acquire(); // 获取互斥锁
int data = buffer[i]; // 消费一个数据
qDebug() << "Consumer consumed: " << data;
mutex.release(); // 释放互斥锁
empty.release(); // 通知生产者缓冲区有空闲了
}
}
private:
QSemaphore& empty; // 缓冲区空闲的信号量
QSemaphore& full; // 缓冲区满的信号量
QSemaphore& mutex; // 互斥锁
int* buffer; // 缓冲区
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QSemaphore empty(BUFFER_SIZE); // 缓冲区空闲的信号量
QSemaphore full(0); // 缓冲区满的信号量
QSemaphore mutex(1); // 互斥锁
int buffer[BUFFER_SIZE] = {0}; // 缓冲区
Producer producer(empty, full, mutex, buffer);
Consumer consumer(empty, full, mutex, buffer);
producer.start();
consumer.start();
producer.wait();
consumer.wait();
return a.exec();
}
```
这个示例代码中使用了三个信号量和一个互斥锁,其中:
- `empty` 是缓冲区空闲的信号量,初始值为缓冲区大小;
- `full` 是缓冲区满的信号量,初始值为 0;
- `mutex` 是互斥锁,初始值为 1;
生产者和消费者在访问缓冲区时都需要获取互斥锁,以保证同一时间只有一个线程在访问缓冲区。当生产者往缓冲区写入数据时,需要等待缓冲区有空闲位置,此时会使用 `empty` 信号量进行等待;当消费者从缓冲区读取数据时,需要等待缓冲区有数据,此时会使用 `full` 信号量进行等待。每当生产者往缓冲区写入一个数据时,会调用 `full.release()` 通知消费者,缓冲区已经有数据了;每当消费者从缓冲区读取一个数据时,会调用 `empty.release()` 通知生产者,缓冲区有空闲位置了。
阅读全文