c++ - 使用 QMutex::tryLock 和 QMutexLocker

标签 c++ qt concurrency mutex

我有一个后台函数,目前有如下内容:

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() {
    MutexTryLocker locker(_mutex);

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

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

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


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

... something else could come along and lock the mutex

如果可能,它将会发生。如果不太可能,只有在您部署它/扩大它/将它卖给客户之后才会发生。

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

相关文章:

c++ - 无法调用结构内部的成员函数指针

带有 Visual Studio 2013 Express 的 QT

c++ - 这是 C++ 条件变量中的错误吗?

c# - 后台工作线程中异步等待的调解器死锁 - 如何检测调用自身的线程

java - 如何保证Java线程不间断地运行直到完成?

c++ - char变量和if语句错误C++

c++ - 从 Eigen Matrix 继承并从内存构造或映射

c++ - C++/Qt 发行版中的库链接

c++ - 如何将不断更新的c++数据显示到QML?

c++ - 这些代码与性能有关吗?一个非常快,另一个超过时间限制