#c #linux #qt #mutex
#c #linux #qt #мьютекс
Вопрос:
Мне было интересно, какое использование лучше в отношении Мьютекса. Два варианта использования, которые пришли мне на ум, это :
1)
Qlist getList()
{
QMutexLocker locker(amp;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(amp;m_mutex);
for ( int i =0 ;i < getList.count ; i )
{
obj = getList.at(i)<br>
//some work
// on obj
}
}
Короче говоря, лучше ли защищать список везде, где он используется, или можно поместить мьютекс в функцию getlist, откуда возвращается список?
Комментарии:
1. Каковы ваши блоки кода вне getList, другие методы того же класса? Также: ужасное форматирование.
Ответ №1:
Я не понимаю, зачем вам блокировать мьютекс в получателе. Все, чего вы добиваетесь, это предотвращения запуска других защищенных разделов во время QList
создания неглубокой копии.
Вам нужно заблокировать мьютекс, пока вы выполняете операции над QList
, которые должны выполняться изолированно от любого другого доступа к QList
. Характер работы, которую вы выполняете над QList
в цикле, и то, как другие потоки могут взаимодействовать с ним в то же время, будет определять, нужно ли его блокировать.
Если ни один другой поток не может изменить количество элементов во время цикла, то может быть безопасно заблокировать только внутри тела цикла работу, которую вы выполняете над каждым элементом (это все еще зависит от того, что другие потоки могут делать с содержимым QList
), в противном случае заблокировать вне тела цикла. Блокировка только внутри средства получения ничего не дает.
Ответ №2:
Блокировка и разблокировка могут быть дорогостоящей операцией, но блокировка ресурса на длительное время может помешать другим потокам продолжать свою работу.
Итак, если какая-то «работа над obj» занимает слишком много времени, я бы заблокировал SomeFuntion(), в противном случае вне цикла for.
Сказав это, я бы также сохранил дизайн в чистоте: это означает, что если часть, в которой есть цикл for, не должна знать о мьютексе (например, находится в другом классе) Я бы заблокировал какую-либо функцию независимо от длины операции, или я бы переместил мьютекс куда-нибудь еще. Конечно, не забудьте задокументировать, какой метод потокобезопасен, а какой нет.
PS: Из опубликованного вами кода довольно сложно понять, находятся ли два блока в одном классе или нет