2012-08-13 63 views
0

http://doc.qt.io/archives/qt-4.7/qmutexlocker.htmlQMutexLocker是否返回错误代码(如果有)?

该类锁定互斥在其构造,所以如果在创建互斥量出现错误,我们就可以知道什么样的错误是它(构造函数不返回任何东西)?

这是一个缺点,不知何故?

我缺少一点吗?

+0

如果你担心了'bad_alloc',那么首先创建互斥量,测试,创造了更衣室之前。你特别担心发生什么? – cmannett85 2012-08-13 12:02:55

+0

@ cbamber85我认为QMutexLocker类可以“安全地”使用 - 而不用担心“任何事情”!如果不是在构造函数中锁定互斥锁,而是将其锁定在一个单独的返回错误代码的类函数中,它会是一个糟糕的设计吗? – 2012-08-13 12:05:41

回答

1

QMutexLocker需要一个指针(并与交易)一个QMutex对象 - 不是pthread_mutex_t对象(即使a QMutex可以在上面实现的pthread_mutex_t)。

锁定/解锁QMutex对象不返回任何类型的错误代码(QMutex::lock()QMutex::unlock()返回void)。

任何可能发生在较低“pthread级别”的错误都将由QMutex对象在内部处理,导致C++异常,或者导致代码中出现缺陷(例如死锁)(例如,if您尝试递归获取不递归的QMutex)。

+0

所以这是不安全的使用,这意味着!我被Qt的一部分所左右。 – 2012-08-14 03:28:07

+2

Qt使设计选择不会为了一个不错的API提供某些类型的错误处理 - 最值得注意的是它不使用异常。但是,刚刚查看了相关的Qt源代码(如果您有疑虑,我建议您也这样做):EBUSY不相关,因为它仅适用于tryLock()。 EAGAIN也不适用,因为Qt使用自己的计数器进行递归锁定。其他错误当然可能发生,但他们极不可能。如果您需要这种错误检查级别,您需要找到另一种解决方案,但对绝大多数用途来说它是“安全”的。 – 2012-08-14 09:14:09

1

你可能会混淆互斥和锁。 互斥体是共享同步对象。 是LO ­ CAL目的,本地为每个执行上下文,其效果同步通过锁定COM ­周一互斥的手段。因此互斥已经以存在的锁是有道理的:

Foo sharedData;   // \ global/ 
QMutex sharedDataMX;  ///shared 

void run_me_many_times() 
{ 
    QMutexLocker lk(&sharedDataMX); 

    // access "sharedData" 
} 
+0

感谢,但'pthread_mutex_lock'返回几种类似EBUSY等错误,所以,互斥变量可能是现有的肯定,但仍可能会出现错误,如 - EAGAIN – 2012-08-13 12:09:27

+2

一个简单的SBRM柜类喜欢你'QMutexLocker'不适合复杂锁定语义。它所做的只是提供一个简单的锁定/解锁。如果您需要更精致的东西,您需要直接连接互斥锁(例如某种形式的'try_lock')。一个C++风格的简单'lock()'不能失败,除非通过一个异常,所以如果你的代码流过'lock()'调用,你就保证有锁。 – 2012-08-13 12:11:13