V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wisefree
V2EX  ›  Qt

不太理解 Qt 多线程 Wait Conditions Example

  •  1
     
  •   wisefree · 2021-11-17 21:23:08 +08:00 · 926 次点击
    这是一个创建于 1109 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 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;
     }
    
    
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2638 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:59 · PVG 11:59 · LAX 19:59 · JFK 22:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.