这是QMutexLocker和QMutex更好的用法

Which is a better usage of QMutexLocker and QMutex?

本文关键字:用法 更好 QMutex QMutexLocker 这是      更新时间:2023-10-16

我想知道哪种用法对互斥体更好。我想到的两种用法是:

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函数中从列表返回一个互斥锁?

我不明白你为什么要在getter中锁定互斥锁。所有你在那里实现的是防止其他受保护的部分运行,而QList浅拷贝。

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

如果在循环过程中没有其他线程可以改变元素的数量,那么只在循环体内锁定你对每个元素所做的工作是安全的(这仍然取决于其他线程对QList的内容所做的操作),否则锁定在循环体外。在getter内部锁定没有实现任何目的。

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

因此,如果某些"处理obj"花费的时间太长,我会锁定somefunction(),否则在for循环之外。

已经说过,我也会保持设计干净:这意味着如果有for循环的部分不应该意识到互斥锁(例如在不同的类中),我将锁定在SomeFunction中,而不管操作的长度,或者我将互斥锁移动到其他地方。当然要记得记录下哪个方法是线程安全的,哪个不是。

PS:从你发布的代码是很难理解,如果两个块是在同一类或不