Russian Qt Forum
Ноябрь 22, 2024, 20:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Голосование
Вопрос: Корректен ли этот код при параллельном исполнении без блокировок ?
Да - 0 (0%)
Нет - 4 (44.4%)
Иногда да - 3 (33.3%)
Ваш вариант - 2 (22.2%)
Всего голосов: 8

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: if (a == localA)  (Прочитано 16873 раз)
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #30 : Февраль 15, 2016, 18:32 »

Хорошо, подведем промежуточные итоги
Вы не правильно представляете итоги. Нет никаких позиций 1 и 2, это все одна и таже позиция.
Вы мыслите в каких-то строках программы, а на самом деле условие может измениться в той же самой строке. Т.е. и проверка и дальнейшее выполнение блока должно быть защищего какими-то средствами синхронизации.

Все же мой ответ был "Иногда да". Конечно нитки должны менять "a" по определенным правилам (на то оно и "иногда").
Как правильно написал Верес: не-не-не! никаких правил. Каждое правило это блокировка, в вашей терминологии.
« Последнее редактирование: Февраль 15, 2016, 20:02 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #31 : Февраль 16, 2016, 08:47 »

Рассмотрим похожий пример: "многопоточный" поиск максимума
Код
C++ (Qt)
if (theMaxA >  localA) {
// что-то делаем полагая >
}
 
Если текущий найденный максимум уже больше - то нечего и блокировки брать. Здесь внимание обычно сосредоточено на второй части, там примитивная ловушка
Код
C++ (Qt)
else  {
QMitexLocker lock(&mutex);
if (localA > theMaxA)    // вот ловушка, theMaxA мог измениться пока брали мутекс, нужно опять проверить
   theMaxA = localA;
}
При этом упускается из виду что if срабатывает всегда верно без блокировок, ну как бы "по алгоритму" или "по построению". Как то же самое сделать для == (вместо >)?   
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #32 : Февраль 18, 2016, 08:49 »

Как-то тихо стало Улыбающийся Возможно подумали типа "ну там в каком-то конкретном алгоритме может и можно, но это сугубо частный случай". По аналогии с "поиском максимума". Все с точностью наоборот: сравнения >< только для арифметики и применимы, а вот равенство - случай весьма общий, от алгоритма практически не зависит. Даже Qt его использует  Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #33 : Февраль 18, 2016, 10:17 »

Нет никакой гарантии, что компилятор будет настолько умным, что распознает поддержку многопоточности и сделает сравнение объектов атомарным. Поэтому лучше мутекс.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #34 : Февраль 19, 2016, 07:11 »

Нет никакой гарантии, что компилятор будет настолько умным, что распознает поддержку многопоточности и сделает сравнение объектов атомарным. Поэтому лучше мутекс.
Мда, в этом недостаток длинных тем - их никто не читает Улыбающийся Если сравнение не атомарно - значит некорректно. Но это совсем не означает обратного - атомарность сравнения еще ничего не гарантирует.

Вообще у пользователей Qt как-то неважно с логикой Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #35 : Февраль 19, 2016, 08:10 »

Мда, в этом недостаток длинных тем - их никто не читает Улыбающийся
Где вы видите длиную тему? Кое как наковыряли третью страницу.
В этом недостаток "непонятных" тем. Это да.

Если сравнение не атомарно - значит некорректно. Но это совсем не означает обратного - атомарность сравнения еще ничего не гарантирует.
О, капитан очевидность в теме. Улыбающийся

Вообще у пользователей Qt как-то неважно с логикой Улыбающийся
Точно. Эта темка в очередной раз это подтверждает, впрочем как и соседняя. Улыбающийся
« Последнее редактирование: Февраль 19, 2016, 08:32 от Old » Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.278 секунд. Запросов: 25.