2012-03-09 41 views
11

Có tương đương Qt của hàng rào để đồng bộ hóa không? Loại nơi người gọi N-1 đầu tiên đến số wait và người gọi thứ N đến số wait khiến tất cả họ bị hủy bỏ.Rào cản đồng bộ hóa Qt?

Trả lời

14

Không, nhưng bạn có thể sử dụng QWaitCondition để thực hiện những rào cản:

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

Cách sử dụng mã ví 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

Đây là cách tiếp cận thay thế của tôi, nhưng cảm ơn, bạn đã lưu tôi một số mã hóa. –

+0

Nhiều nghĩa vụ, @alexisdm! Chỉ cần một lưu ý, trong hàm tạo 'BarrierData', bạn tham số bạn truyền vào hàm tạo có cùng tên với biến. –

+0

@Adri: Tôi nghĩ rằng đó là mục đích. Nó là hoàn toàn hợp pháp và giúp bạn tiết kiệm từ phát minh ra các quy ước ngớ ngẩn. Bộ đếm –

Các vấn đề liên quan