这是QMutexLocker和QMutex更好的用法
Which is a better usage of QMutexLocker and QMutex?
我想知道哪种用法对互斥体更好。我想到的两种用法是:
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:从你发布的代码是很难理解,如果两个块是在同一类或不
相关文章:
- C++:将控制台输出存储在宏中更好吗
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 为什么新的随机库比std::rand()更好
- 寻找一种更好的方法来表示无符号字符数组
- 哪种方法更好,性能明智
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 什么是更好的做法?通过指针或标识符传递类成员?
- 寻求更好地理解标准::访问
- 线程消息传递或更好:在"大师班"中访问其他班级的成员
- 有没有更好的方法来处理异常? try-catch块真的很丑
- 如何更好地检查两个 char 变量是否在一组值中?
- 有没有更好的方法对C++中的三个整数进行排序?
- 什么模板用法在阶乘中更好
- 平面缓冲区可以利用向量中的 0 吗?还是其他小波比哈尔变换更好?
- 我们应该如何使用枚举类进行索引(或者我们应该更好地避免这种情况)?
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 这是QMutexLocker和QMutex更好的用法
- r语言 - 用NumericVector填充c++数组的更好的习惯用法