c++qt

Qt synchronization barrier?


Is there a Qt equivalent of a barrier for synchronization? The type where the first N-1 callers to wait block and the Nth caller to wait causes them all to release.


Solution

  • No, but you can use QWaitCondition to make these barriers:

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

    Usage example code:

    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();
        }
        ...
    }