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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Нужна ли блокировка ?  (Прочитано 5794 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Январь 24, 2012, 14:12 »

Добрый день

Такой кусочек выполняется 2 или более нитками
Код
C++ (Qt)
if (Test(data))
data->mFlag |= 1;
 
Нужно ли защищать установку бита мутексом?

Спасибо
Записан
mutineer
Гость
« Ответ #1 : Январь 24, 2012, 14:30 »

Если внутри Test(data) читается mFlag, то нужно обязательно. Причем весь if
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #2 : Январь 24, 2012, 17:21 »

Также нет гарантий того, что "data->mFlag |= 1;" атомарна. Можно перейти на использование QAtomicInt. Также обрати внимание на QReadWriteLock
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Январь 24, 2012, 17:26 »

Также нет гарантий того, что "data->mFlag |= 1;" атомарна.
Она просто не атомарна  Улыбающийся  Ну и что? Чем мне это грозит?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Январь 24, 2012, 17:48 »

Цитировать
Она просто не атомарна

Зависит от типа mFlag, компилятора, уровня оптимизации

Цитировать
Ну и что? Чем мне это грозит?

Одновременное выполение инструкций "operator|=". Причем для одного потока выполенние инструкций может только начаться, а для другого еще не заверщиться.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
mutineer
Гость
« Ответ #5 : Январь 24, 2012, 17:50 »

Цитировать
Ну и что? Чем мне это грозит?

Одновременное выполение инструкций "operator|=". Причем для одного потока выполенние инструкций может только начаться, а для другого еще не заверщиться.

В принципе результат выполнения в любом случае будет один и тот же)))
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Январь 24, 2012, 17:59 »

В принципе результат выполнения в любом случае будет один и тот же)))

Если нет модификации mFlag в другом месте, то пожалуй соглашусь в контексте данного примера )
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Январь 24, 2012, 18:11 »

Зависит от типа mFlag, компилятора, уровня оптимизации
То есть какие-то операции могут быть или не быть атомарными в зависимости от кода? Не могу утверждать 100%, но очень вряд ли. Требуется 2 или более машинных команд (надо нести mFlag в регистр) значит не атомарно.

Если нет модификации mFlag в другом месте, то пожалуй соглашусь в контексте данного примера )
Ну если выполнение хотя бы 2 нитками - то др место уже есть  Улыбающийся
Записан
mutineer
Гость
« Ответ #8 : Январь 24, 2012, 18:15 »

Если нет модификации mFlag в другом месте, то пожалуй соглашусь в контексте данного примера )
Ну если выполнение хотя бы 2 нитками - то др место уже есть  Улыбающийся

Имеется в виду другое место в коде. Если две и более ниток одновременно выполняют data->mFlag |= 1;, то из-за сути операции | результат будет всегда один и тот же
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Январь 24, 2012, 19:44 »

Зависит от типа mFlag, компилятора, уровня оптимизации
То есть какие-то операции могут быть или не быть атомарными в зависимости от кода? Не могу утверждать 100%, но очень вряд ли. Требуется 2 или более машинных команд (надо нести mFlag в регистр) значит не атомарно.

Можно, напрмиер, заглянуть вот в эту статью. В ней расматривается несколько операторов. Какой компилятор и какие параметры оптимизации использовались неуказано.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Январь 24, 2012, 19:51 »

Но снова повторюсь, что полагаться на компилятор не стоит, темболее если речь идет о кросс-платформенной разработке
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Январь 24, 2012, 20:33 »

Можно, напрмиер, заглянуть вот в эту статью.
Убедили, да, напр операция ++ может быть атомарной или нет в зависимости от кода (в общем случае нет). Но разговор не о том. Допустим сделали атомарно (неважно как реализован AtomicOr).
Код
C++ (Qt)
if ((data->mFlag & 1) == 0)
if (Test(data))
 AtomicOr(&data->mFlag, 1);  // или мутекс
 
Ну и что мы таким образом защитили? Я так вижу что аж ничего Улыбающийся Взять весь кусок под мутекс - это работает всегда, но скорость может быть убита в ноль. Думается что (если ситуация позволяет) лучше смириться с тем что Test сработает впустую (когда уже mFlag стоит) чем связываться с локом  
« Последнее редактирование: Январь 24, 2012, 20:34 от Igors » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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