2016-07-13 15 views
1

カウントダウンラッチ(a.k.a. CountDownLatch)は、使用されたすべてのリソースがプリミティブが破棄される前に解放されることを保証する同期プリミティブです。 QSemaphoreと似ていますが、逆の作業をしています。リソースを取得しないようにブロックし、すべてのリソースが解放されていることを確認します。Qtでカウントダウンラッチを実装するには?

Qtで簡単に実装する方法は?ここで

答えて

1

QSemaphoreを活用し、実装です:

// https://github.com/KubaO/stackoverflown/tree/master/questions/countdown-latch-38362044 
#include <climits> 
#include <QSemaphore> 

class CountDownLatch { 
    Q_DISABLE_COPY(CountDownLatch) 
    QSemaphore m_sem{INT_MAX}; 
public: 
    CountDownLatch() {} 
    ~CountDownLatch() { 
    m_sem.acquire(INT_MAX); 
    m_sem.release(INT_MAX); 
    } 
    class Locker { 
    CountDownLatch * sem; 
    public: 
    Locker(const Locker & other) : sem{other.sem} { sem->m_sem.acquire(); } 
    Locker(Locker && other) : sem{other.sem} { other.sem = nullptr; } 
    Locker(CountDownLatch * sem) : sem{sem} { sem->m_sem.acquire(); } 
    ~Locker() { if (sem) sem->m_sem.release(); } 
    }; 
    Locker lock() { return Locker{this}; } 
}; 

使用するには、ラッチがブロックされて滞在したいながらCountdownLatch::Lockerのインスタンスを保持します。ラッチのデストラクタは、すべてのロッカーが破壊されるまでブロックします。

#include <QtConcurrent> 

struct MyClass { 
    CountDownLatch m_latch; 
    MyClass() { 
    auto lock = m_latch.lock(); // must be taken here 
    QtConcurrent::run([this, lock]{ 
     // DON'T lock here, you'll have a race! 
     QThread::sleep(10); 
    }); 
    } 
}; 

int main() { 
    MyClass a; 
} 

インスタンスaは、並行作業者が完了するまで、つまり10秒間続きます。

関連する問題