2012-03-09 11 views
11

क्या सिंक्रनाइज़ेशन के लिए बाधा के बराबर एक क्यूटी बराबर है? वह प्रकार जहां पहले एन -1 कॉलर wait ब्लॉक और एनटी कॉलर wait पर सभी को रिलीज़ करने का कारण बनता है।क्यूटी सिंक्रनाइज़ेशन बाधा?

उत्तर

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! बस एक नोट, 'बैरियरडाटा' कन्स्ट्रक्टर में, आप जिस पैरामीटर को कन्स्ट्रक्टर में पास करते हैं वह वैरिएबल के समान नाम है। –

+0

@Adri: मुझे लगता है कि उद्देश्य पर था। यह पूरी तरह से कानूनी है और आपको मूर्ख सम्मेलनों का आविष्कार करने से बचाता है। –

संबंधित मुद्दे