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

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

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

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

Сообщений: 11445


Просмотр профиля
« : Февраль 14, 2016, 10:06 »

Код
C++ (Qt)
if (a == localA) {
// что-то делаем предполагая  ==
}
Этот участок кода НЕ защищен блокировками и может одновременно выполняться 2 или более нитками. Любая из них может менять переменную "a", переменная localA на стеке.

Можем ли мы опираться на рез-т такого сравнения?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Без указания типа A вопрос бессмысленный, я оператор == могу определить как угодно.
И что значит опираться на результаты?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Без указания типа A вопрос бессмысленный, я оператор == могу определить как угодно.
Если, по Вашему мнению, зависит от типа и/или оператора, то ответ "Иногда" - с примерчиками когда да, а когда нет

И что значит опираться на результаты?
Значит в плече if'а мы уверены что равенство остается истинным
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Значит в плече if'а мы уверены что равенство остается истинным
Конечно нет. В некоторых случаях мы можем быть уверены, что в момент проверки равенство истино.
Поэтому и усомнился в смысле опроса.
« Последнее редактирование: Февраль 14, 2016, 10:41 от Old » Записан
Akon
Гость
« Ответ #4 : Февраль 14, 2016, 10:56 »

(a == localA) корректна, если:
1. Соответствующая ассемблерная инструкция будет атомарной (одной, а не состоять из нескольких). Если операнды не превышают используемого машинного слова, то инструкция будет атомарной. Например, для 32бит. кода все что меньше int (32 bit) дает одну инструкцию, а вот для int64 будет две инструкции. Я имею ввиду код для регистров общего назначения, SIMD-операнды (например, 256-битные) и в 32-х битном коде тоже будут атомарны.
2. a должна быть volatile.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

(a == localA) корректна, если:
Разумеется. Но вопрос был
Можем ли мы опираться на рез-т такого сравнения?
Т.е. речь идет о коде выполняемом в скобках if'a, который может быть достаточно (или сколь угодно) длинным
Записан
Bepec
Гость
« Ответ #6 : Февраль 14, 2016, 12:17 »

неизвестны типы, неизвестны внешние условия, неизвестно может ли быть произведено удаление/замещение переменной. А так, если абстрагироваться от этих вещей, то уже ответили - при атомарной операции можем.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Февраль 14, 2016, 12:40 »

неизвестны типы, неизвестны внешние условия, неизвестно может ли быть произведено удаление/замещение переменной. А так, если абстрагироваться от этих вещей, то уже ответили - при атомарной операции можем.
Что такое "удаление/замещение" переменной - хз Улыбающийся О том что все нитки могут ее писать/читать сказано ясно. Опасаетесь какой-то ловушки с типом - хорошо, пусть тип 'а' просто int
Записан
Akon
Гость
« Ответ #8 : Февраль 14, 2016, 12:56 »

Цитировать
Т.е. речь идет о коде выполняемом в скобках if'a, который может быть достаточно (или сколь угодно) длинным
?? абстрактный вопрос. А в чем принципиальная разница изменяется ли конкретной ниткой 'a' в 'if' блоке или где-то еще?

В общем случае нужна синхронизация. Грамотно она делается так (блокировка с двойной проверкой):
Код:
if (a == localA) {
  QMutexLocker(mutex);
  if (a == localA) {
   ....
    a = b;
  }
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

?? абстрактный вопрос. А в чем принципиальная разница изменяется ли конкретной ниткой 'a' в 'if' блоке или где-то еще?
Не спрашивается где и как меняется "a", с блокировками или без. Речь идет об участке коде которому необходимо чтобы равенство оставалось истинным, иначе он развалится
// что-то делаем предполагая  ==

В общем случае нужна синхронизация. Грамотно она делается так (блокировка с двойной проверкой):
В условии сказано
Этот участок кода НЕ защищен блокировками

Да, неск лет назад Вы уже отвечали на почти такой же вопрос  Улыбающийся
« Последнее редактирование: Февраль 14, 2016, 13:19 от Igors » Записан
Bepec
Гость
« Ответ #10 : Февраль 14, 2016, 13:37 »

удаление/замещение - это удаление переменной или изменение указателя, т.к. тип у вас хз какой.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Хоть один ответил "нет" - вот это по-мужски, а то когда же возможно то самое "иногда" когда кусок кода работает просто по if'у, и ничего не боится ? 

удаление/замещение - это удаление переменной или изменение указателя, т.к. тип у вас хз какой.
А Вы бы не калякали, а слушали что умные люди говорят
Код
C++ (Qt)
if (index.isValid()) { ...
Без захвата мутекса это не будет работать верно в 2 нитках, т.к. вызов QModelIndex::isValid() никак не атомарный. Хоть это уясните
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Хоть один ответил "нет"
Ну так я вам в третьем посте это написал словами, а сейчас пришлось сделать выбор в опросе, что бы посмотреть результаты. Улыбающийся
Другого результата я и не ожидал.
« Последнее редактирование: Февраль 14, 2016, 16:51 от Old » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Хоть один ответил "нет"
Но могу сделать "да", что-бы код выше стал корректным (с некоторыми условиями). Улыбающийся
« Последнее редактирование: Февраль 14, 2016, 16:53 от Old » Записан
Bepec
Гость
« Ответ #14 : Февраль 14, 2016, 17:19 »

Как печально Igors что вы не понимаете цимуса. Вы не подумали как index превратится в massiveRow[].
Наверно из него получим строку и столбец и после проверим есть ли такой элемент в массиве... Печально, не правда ли? И да, эти простейшие операции защищены мутексом в ф-ции data. Как же вы узко на мир глядите Улыбающийся
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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