哪个是QMutexLocker和QMutex的更好用法?

时间:2011-11-11 07:03:54

标签: c++ linux qt mutex

我想知道哪种用法比Mutex更好。我想到的两个用法是:

1)

   Qlist getList()
   {
      QMutexLocker locker(&m_mutex);
      return m_list;

   }

   for ( int i =0 ;i < getList.count ; i++)
   {
             obj = getList.at(i)
             //some work 
             //  on obj            
    }

2)

    Qlist getList()
    {
      return m_list;

   }

   {
     QMutexLocker locker(&m_mutex);
     for ( int i =0 ;i < getList.count ; i++)
     {
             obj = getList.at(i)<br>
             //some work 
             //  on obj                
     }
   }

简而言之,最好是保护列表,无论它在哪里使用,或者可以在getlist函数中放置一个互斥量,从中返回列表?

2 个答案:

答案 0 :(得分:3)

我不明白为什么要锁定互斥锁中的互斥锁。你正在实现的目的是阻止其他受保护的部分在QList浅拷贝的情况下运行。

您需要在QList执行操作时锁定互斥锁,这些操作需要与QList的任何其他访问隔离开来。您在循环中对QList执行的工作的性质以及其他线程可能同时与其进行交互将决定您是否需要锁定它。

如果没有其他线程可以在循环期间更改元素的数量,那么在每个元素的工作周围仅锁定循环体内是安全的(它仍然取决于其他线程可能对其中的内容做什么) QList),否则锁定在循环体外。锁定在吸气剂中是没有任何作用的。

答案 1 :(得分:1)

锁定和解锁可能是一项昂贵的操作,但长时间锁定资源可能会阻止其他线程继续工作。

因此,如果某些“on obj”工作时间太长,我会锁定SomeFuntion(),否则会在for循环之外。

话虽如此,我也会保持设计清洁:这意味着如果具有for循环的部分不应该知道互斥锁(例如,在不同的类中),我会锁定SomeFunction而不管它是什么操作的长度,或者我会将互斥锁移动到其他地方。 当然记得记录哪个方法是线程安全的,哪个方法不是。

PS:从您发布的代码中很难理解这两个块是否在同一个类中