2012-03-09 80 views

回答

14

没有,但你可以使用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(); 
    } 
    ... 
} 
+0

这是我的另一种方法,但感谢,你救了我一些编码。 – 2012-03-10 09:08:47

+0

非常感谢,@alexisdm!请注意,在BarrierData构造函数中,您传递给构造函数的参数与变量具有相同的名称。 – 2013-05-02 15:49:10

+0

@Adri:我认为这是有意的。这是完全合法的,并且可以使你避免发明愚蠢的约定。 – 2016-09-15 21:48:35