关于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函数中放一个互斥锁更好?
发布于 2011-11-11 16:16:32
我不明白你为什么要把互斥锁锁在getter里。你所要做的就是阻止其他受保护的部分在QList浅层拷贝的同时运行。
当您在QList上执行需要与对QList的任何其他访问隔离的操作时,您需要锁定互斥锁。您在循环中的QList上所做的工作的性质以及其他线程可能如何在同一时间与它交互将决定您是否需要锁定它。
如果在循环期间没有其他线程可以更改元素的数量,那么只在您对每个元素所做的工作周围的循环体中锁定可能是安全的(这仍然取决于其他线程可以如何处理QList的内容),否则锁定在循环体之外。仅在getter中锁定不会有任何效果。
发布于 2011-11-11 15:47:37
锁定和解锁可能是一项代价高昂的操作,但长时间锁定资源可能会阻止其他线程继续其工作。
因此,如果“处理obj”花费的时间太长,我就会锁在SomeFuntion()中,否则就会在for循环之外。
话虽如此,我也会保持设计的整洁:这意味着如果有for循环的部分不应该知道互斥锁(例如,在不同的类中),我就会锁定SomeFunction,而不管操作的长度,否则我会把互斥锁移到其他地方。当然,记得记录哪个方法是线程安全的,哪个不是。
PS:从您发布的代码中,很难理解这两个块是否在同一个类中
https://stackoverflow.com/questions/8090706
复制相似问题