2012-03-09 8 views
11

同期用のバリアに相当するQtはありますか?最初のN-1発呼者がwaitブロックに、N番目の発呼者がwaitに発呼するタイプは、それらのすべてを解放する。Qt同期障壁?

答えて

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

は、これは私の別のアプローチでしたが、おかげで、あなたは私にいくつかのコードを保存しました。 –

+0

多くの義務付けられた@alexisdm!ちょうどメモ、 'BarrierData'コンストラクタでは、コンストラクタに渡すparamは変数と同じ名前です。 –

+0

@Adri:それは目的にあったと思います。それは完全に合法であり、愚かな慣習を発明することからあなたを救う。 –

関連する問題