Qt同步屏障

Qt synchronization barrier?

本文关键字:同步 Qt      更新时间:2023-10-16

是否存在与同步屏障等效的Qt?wait块的第一个N-1个呼叫者和wait的第N个呼叫器导致它们全部释放的类型。

没有,但您可以使用QWaitCondition来制作这些屏障:

#include <QMutex>
#include <QWaitCondition>
#include <QSharedPointer>
// Data "pimpl" class (not to be used directly)
class BarrierData
{
public:
    BarrierData(int count) : count(count) {}
    void wait() {
        mutex.lock();
        --count;
        if (count > 0)
            condition.wait(&mutex);
        else
            condition.wakeAll();
        mutex.unlock();
    }
private:
    Q_DISABLE_COPY(BarrierData)
    int count;
    QMutex mutex;
    QWaitCondition condition;
};
class Barrier {
public:
    // Create a barrier that will wait for count threads
    Barrier(int count) : d(new BarrierData(count)) {}
    void wait() {
        d->wait();
    }
private:
    QSharedPointer<BarrierData> d;
};

使用示例代码:

class MyThread : public QThread {
public:
    MyThread(Barrier barrier, QObject *parent = 0) 
    : QThread(parent), barrier(barrier) {}
    void run() {
        qDebug() << "thread blocked";
        barrier.wait();
        qDebug() << "thread released";
    }
private:
    Barrier barrier;
};
int main(int argc, char *argv[])
{   
    ...
    Barrier barrier(5);
    for(int i=0; i < 5; ++i) {
        MyThread * thread = new MyThread(barrier);
        thread->start();
    }
    ...
}