【问题标题】:Qt synchronization barrier?Qt同步屏障?
【发布时间】:2012-03-09 16:16:13
【问题描述】:

是否有一个 Qt 等效的同步屏障? wait 的前 N-1 个调用者阻塞,wait 的第 N 个调用者导致它们全部释放的类型。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    不,但您可以使用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();
        }
        ...
    }
    

    【讨论】:

    • 这是我的替代方法,但是谢谢,您为我节省了一些编码。
    • 非常感谢,@alexisdm!请注意,在BarrierData 构造函数中,您传递给构造函数的参数与变量具有相同的名称。
    • @Adri:我认为这是故意的。这是完全合法的,并且可以避免您发明愚蠢的约定。
    • 计数器永远不会重置或增加,所以这个屏障只会工作一次。查看 boost 中的实现,似乎缺少一些东西! boost.org/doc/libs/1_40_0/boost/thread/barrier.hpp
    猜你喜欢
    • 2015-03-09
    • 2021-12-02
    • 1970-01-01
    • 2016-06-22
    • 2013-08-31
    • 2017-10-19
    • 2013-12-15
    • 1970-01-01
    • 2020-02-02
    相关资源
    最近更新 更多