qt 管道加锁 示例代码
时间: 2024-10-12 10:02:38 浏览: 35
Qt中的管道(QPipe)是一种用于线程间通信的机制,它允许数据在两个独立线程之间双向传输。为了保证数据安全并避免竞争条件,我们可以使用`QMutex`(互斥锁)对管道进行同步操作。下面是一个简单的示例代码:
```cpp
#include <QObject>
#include <QThread>
#include <QPipe>
#include <QMutex>
class Producer : public QObject {
public:
explicit Producer(QPipe* pipe) : pipe(pipe), mutex(&mLock) {}
private slots:
void produceData() {
for (int i = 0; i < 10; ++i) {
QMutexLocker locker(mutex);
QByteArray data(QStringLiteral("Message %1").arg(i));
pipe->write(data);
emit producedData();
}
emit productionFinished();
}
signals:
void producedData();
void productionFinished();
private:
QPointer<QPipe> pipe;
QMutex mLock;
};
class Consumer : public QObject {
public:
explicit Consumer(QPipe* pipe) : pipe(pipe) {}
private slots:
void consumeData() {
while (!pipe->bytesAvailable()) {
// 这里可以添加其他任务,不会阻塞主线程
}
QByteArray data;
pipe->readLine(data);
qDebug() << "Received data: " << data;
}
signals:
void newDataReceived();
private:
QPointer<QPipe> pipe;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QPipe pipe;
Producer producer(&pipe);
Consumer consumer(&pipe);
ProducerThread producerThread(&producer);
producerThread.start();
ConsumerThread consumerThread(&consumer);
consumerThread.start();
producerThread.wait(); // 等待生产者完成
return app.exec();
}
```
在这个例子中,我们创建了一个Producer线程负责生成数据并通过管道传递给Consumer线程。`QMutex` `mutex` 被用来保护对管道的读写操作,确保数据在并发访问下的一致性。
阅读全文