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

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

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

Сообщений: 11445


Просмотр профиля
« : Февраль 04, 2012, 14:30 »

Добрый день

Обнаружил деталь совсем простую которая однако меня удивила. Вот пример кода выполняемого в 2 или более нитках
Код
C++ (Qt)
double value = CalculateSomething(..);
QMutexLocker lock(&mutex);   // защищаем установку глобальной переменной theMax
if (value > theMax)             // устанавливаем theMax
theMax = value;
 
Здесь нет никакой ошибки, но, оказывается, можно написать лучше. 
Ну наверное это совсем просто для молодых людей которые так много знают  Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


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

Код:
double value = CalculateSomething(..); 
theMax = qMax(value, theMax);
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Февраль 04, 2012, 15:16 »

Код:
double value = CalculateSomething(..); 
theMax = qMax(value, theMax);
Блин, ну Вас голова на UI заточена (хотя грамотный пацан и на правильной платформе). Ну нельзя же так
Код
C++ (Qt)
template <typename T>
inline const T &qMax(const T &a, const T &b) { if (a < b) return b; return a; }
 
Пусть пока "a" (value) = 1, а "b" theMax = 0. Значит (a < b) = false. Возвращаем a (1). Но в этот момент ОС передал управление др нитке - и она поставила theMax напр 10. А когда управление вернулось мы его затерли на 1  Плачущий
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #3 : Февраль 04, 2012, 15:40 »

Блин, ну Вас голова на UI заточена (хотя грамотный пацан и на правильной платформе). Ну нельзя же так
Вы таки затрахали тыкать всех носом в то что они только формочки умеют клепать. У меня голова заточена на то что присваивание дабла атомарно. А вот проверка+присваивание, уже нет, что я не учел.
Записан
TaIRou
Гость
« Ответ #4 : Февраль 04, 2012, 16:21 »

Фактически надо увеличить theMax на разницу с вычисленным значением, но как это сделать атомарно... В замешательстве
Записан
mutineer
Гость
« Ответ #5 : Февраль 04, 2012, 16:27 »

Ты хочешь получить ответ как это оптимизировать или просто тыкнуть форумчан носом в "а вот я знаю, а вы нет :-P" ? Из топика не очень понятно
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Февраль 04, 2012, 19:40 »

Ты хочешь получить ответ как это оптимизировать или просто тыкнуть форумчан носом в "а вот я знаю, а вы нет :-P" ? Из топика не очень понятно
Я сам очень не люблю когда "знаток" чего-то вычитал и потом на понтах типа "ты не знаешь а вот я (Я) знаю!". Но это я нигде не читал, просто случайно заметил. Приведенный мною код плохой и его можно заметно улучшить - не привлекая никаких тулзов.
Записан
mutineer
Гость
« Ответ #7 : Февраль 04, 2012, 21:17 »

Приведенный мною код плохой и его можно заметно улучшить - не привлекая никаких тулзов.

Так ты не знаешь решения и хочешь, чтобы тебе его подсказали? Или это викторина на отгадку твоего решения?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #8 : Февраль 04, 2012, 21:32 »

Ну если знать, что над theMax других операций (которые его могут уменьшить) можно так:
Код:
if (value > theMax )             // не делаем лок, когда это точно не нужно
{
    QMutexLocker lock(&mutex);   // защищаем установку глобальной переменной theMax
    if (value > theMax)             // устанавливаем theMax
    {
        theMax = value;
    }
}
Но справедливо толко если на платформе присваивание double на целевой платформе атамарно.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Ну если знать, что над theMax других операций (которые его могут уменьшить) можно так:
вставьте "нет" (перед "других операций").

Да, это именно та "Америка" которую я открыл  Улыбающийся

Но справедливо толко если на платформе присваивание double на целевой платформе атамарно.
Неясно причем здесь атомарность присваивания double если присваивание всегда защищено? Может имелось ввиду сравнение double ?

Edit: а, понял о чем Вы. Если напр double хранится в виде старшая часть + младшая (как long на первых PC). Но трудновато представить машину с 2 и более процессорами которая однако не имеет FPU регистров  Улыбающийся
« Последнее редактирование: Февраль 05, 2012, 09:39 от Igors » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #10 : Февраль 05, 2012, 10:22 »

Edit: а, понял о чем Вы. Если напр double хранится в виде старшая часть + младшая (как long на первых PC).
Да, именно об этом - если на момент сравнения может присвоисвоиться только часть дабла, то при сравненнии в нём может оказаться левое число (а так же теоретически бесконечность или NaN).

Но трудновато представить машину с 2 и более процессорами которая однако не имеет FPU регистров.
Это да.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #11 : Февраль 05, 2012, 16:01 »

В одном топике уже говорил и снова повторюсь: нет абсолютно никаких гарантий, что операция присваения double атомарна и это не должно вобще рассматриваться как упрощение\улучшение кода первого поста (убрать мютех).

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

Igors, тебе реально нужна помощь или так проверочка, кто на что гаразд? Непонятна также фраза "можно написать лучше"? Что значит лучше? Имеется ввиду производителнее?

Записан

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

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Февраль 05, 2012, 17:22 »

В одном топике уже говорил и снова повторюсь: нет абсолютно никаких гарантий, что операция присваения double атомарна и это не должно вобще рассматриваться как упрощение\улучшение кода первого поста (убрать мютех).
Убрать мутекс просто неправильно, как обсуждалось выше. Атомарность здесь надо понимать ширше, напр
Код
C++ (Qt)
if (value < theMax)
 
Может value сравнивалось с новым значением, а может и со старым. Но случай когда theMax вообще урод (ни новое ни старое) нереален  (опять см обсуждение выше)

Непонятна также фраза "можно написать лучше"? Что значит лучше? Имеется ввиду производителнее?
Да что имею - то и введу. Если CalculateSomething - не очень жирная, то раз так в 10-100 (на мутексе можно сжечь очень много)

Igors, тебе реально нужна помощь или так проверочка, кто на что гаразд?
Это чистый оффтоп, ладно, обсудим. С чего Вы взяли что любой создатель темы "просит о помощи"?  Любой форум плохо подходит в роли "live help". Разделение на "юниоров" (которые "просят помощи") и "сеньоров" (больших, белых и пушистых, которые  все знают) мало что дает - и просто глупо. Юниору (который выше травы) быстро надоедает роль "мальчика для битья" и он убеждается что проще действовать самому (тем более Qt дока просто прекрасна). У сеньора какое-то время сохраняется иллюзия что, отвечая на вопросы, он (якобы) шлифует свои знания/мастерство - но это проходит

Кто собственно мешает просто обсуждать что интересно? Почему хорошим тоном de-facto считается мгновенно выданный ответ (из букваря)? А подумать? А обсудить?
Записан
BRE
Гость
« Ответ #13 : Февраль 05, 2012, 17:41 »

Кто собственно мешает просто обсуждать что интересно? Почему хорошим тоном de-facto считается мгновенно выданный ответ (из букваря)? А подумать? А обсудить?
Если вопрос из букваря, то почему ответ должен быть не оттуда? Ты недавно Андрюшку Александреску не читал?
Прием этот был описан еще в далеком 1996 году и назван Double-Checked Locking, в книги этот прием приводится в отношении создании синглетонов в многонитевой среде, но прекрасно подходит и для других нужд.
Записан
TaIRou
Гость
« Ответ #14 : Февраль 05, 2012, 17:45 »

Просто в первом посте читался скорее вызов, нежели предложение к обсуждению Смеющийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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