不太理解 Qt 多线程 Wait Conditions Example

2021-11-17 21:23:08 +08:00
 wisefree
buffer[i % BufferSize] = "ACGT"[QRandomGenerator::global()->bounded(4)];  // 写入数据

fprintf(stderr, "%c", buffer[i % BufferSize]);  // 读取数据

这个难道是线程安全的吗?

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;
 }

809 次点击
所在节点    Qt
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/816138

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX