- char buffer[BufferSize]是全局变量
buffer[i % BufferSize] = "ACGT"[QRandomGenerator::global()->bounded(4)]; // 写入数据 fprintf(stderr, "%c", buffer[i % BufferSize]); // 读取数据 这个难道是线程安全的吗?
- qt 中 Wait Conditions 需要考虑虚假唤醒吗?
qt 自带代码如下:
#include <QtCore> #include <stdio.h> #include <stdlib.h> const int DataSize = 100000; const int BufferSize = 8192; char buffer[BufferSize]; QWaitCondition bufferNotEmpty; QWaitCondition bufferNotFull; QMutex mutex; int numUsedBytes = 0; class Producer : public QThread { public: Producer(QObject *parent = NULL) : QThread(parent) { } void run() override { for (int i = 0; i < DataSize; ++i) { mutex.lock(); if (numUsedBytes == BufferSize) bufferNotFull.wait(&mutex); mutex.unlock(); buffer[i % BufferSize] = "ACGT"[QRandomGenerator::global()->bounded(4)]; mutex.lock(); ++numUsedBytes; bufferNotEmpty.wakeAll(); mutex.unlock(); } } }; class Consumer : public QThread { Q_OBJECT public: Consumer(QObject *parent = NULL) : QThread(parent) { } void run() override { for (int i = 0; i < DataSize; ++i) { mutex.lock(); if (numUsedBytes == 0) bufferNotEmpty.wait(&mutex); mutex.unlock(); fprintf(stderr, "%c", buffer[i % BufferSize]); mutex.lock(); --numUsedBytes; bufferNotFull.wakeAll(); mutex.unlock(); } fprintf(stderr, "\n"); } signals: void stringConsumed(const QString &text); }; int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); Producer producer; Consumer consumer; producer.start(); consumer.start(); producer.wait(); consumer.wait(); return 0; } 