我有一个后台函数,目前有如下内容:
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/