我有一个后台功能,当前具有如下所示的内容:

void SomeClass::someFunction()
{
    if (!_mutex.tryLock())
    {
        // i want to know the mutex is locked, and then exit the function
        return;
    }
    else
    {
        _mutex.unlock();
    }

    QMutexLocker locker(_mutext);

    // do some stuff that **could** throw an exception
}

我的困境与_mutex.unlock()QMutextLocker语句有关。

如果_mutex被锁定,那么我想知道。如果不是,那么我要锁定它。问题是我想使用QMutexLocker来锁定_mutex的大部分功能。该函数可能会引发异常,因此手动解锁_mutex可能很困难且容易出错。

上面的解决方案有效,但令我担心的是,在_mutex.unlock()QMutexLocker减速之间的某个时间,可能会发生其他事情并锁定互斥锁。

有人对更好的方法有任何建议吗?

谢谢你。

最佳答案

QMutexLocker显然不能完全满足您的需求,但是您可以很容易地编写自己的RAII包装器:

class MutexTryLocker {
  QMutex &m_;
  bool locked_;
public:
  MutexTryLocker(QMutex &m) : m_(m), locked_(m.tryLock()) {}
  ~MutexTryLocker() { if (locked_) m_.unlock(); }
  bool isLocked() const { return locked_; }
}

并像这样使用它:
void SomeClass::someFunction() {
    MutexTryLocked locker(_mutex);

    if (!locker.isLocked()) {
        // we didn't get the lock, so return
        return;
    }

    // do some stuff that **could** throw an exception
}

请注意,此储物柜只是示例代码:生产版本可能应该明确地不可复制。

历史记录:JBL的评论提到了一段段落,该段落不再是问题中的句子。我将其解释为:



如果可能的话,那将会发生。如果不太可能,则只有在您将其部署/扩展/出售给客户之后才会发生。

关于c++ - 使用QMutex::tryLock和QMutexLocker,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20349787/

10-12 19:20