2012-03-09 14 views
11

¿Hay un Qt equivalente a una barrera para la sincronización? El tipo en el que las primeras personas que llaman N-1 a wait bloquean y la N-ésima persona que llama a wait hace que todas se liberen.Qt barrera de sincronización?

Respuesta

14

No, pero se puede utilizar para hacer QWaitCondition estas barreras:

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

Uso de código de ejemplo:

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

Este fue mi enfoque alternativo, pero gracias, me he ahorrado algo de código. –

+0

Muy obligado, @alexisdm! Solo una nota, en el constructor 'BarrierData', el parámetro que pasas al constructor tiene el mismo nombre que la variable. –

+0

@Adri: Creo que fue a propósito. Es perfectamente legal y le evita inventar convenciones tontas. El contador –

Cuestiones relacionadas