【问题标题】:How to implement a countdown latch in Qt?如何在 Qt 中实现倒计时锁存器?
【发布时间】:2016-07-13 21:31:44
【问题描述】:

倒计时锁存器(又名CountDownLatch)是一种同步原语,可确保在销毁原语之前释放所有使用的资源。它就像一个QSemaphore,但反过来工作:我们想要阻止不是为了获取资源,而是确保所有资源都已被释放。

在 Qt 中实现它的简单方法是什么?

【问题讨论】:

    标签: c++ qt synchronization


    【解决方案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 秒。

    【讨论】:

      猜你喜欢
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 2012-05-26
      • 2016-08-22
      • 1970-01-01
      相关资源
      最近更新 更多