Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Igors от Февраль 04, 2012, 14:30



Название: Максимальное значение
Отправлено: Igors от Февраль 04, 2012, 14:30
Добрый день

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


Название: Re: Максимальное значение
Отправлено: Авварон от Февраль 04, 2012, 14:43
Код:
double value = CalculateSomething(..); 
theMax = qMax(value, theMax);


Название: Re: Максимальное значение
Отправлено: Igors от Февраль 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  :'(


Название: Re: Максимальное значение
Отправлено: Авварон от Февраль 04, 2012, 15:40
Блин, ну Вас голова на UI заточена (хотя грамотный пацан и на правильной платформе). Ну нельзя же так
Вы таки затрахали тыкать всех носом в то что они только формочки умеют клепать. У меня голова заточена на то что присваивание дабла атомарно. А вот проверка+присваивание, уже нет, что я не учел.


Название: Re: Максимальное значение
Отправлено: TaIRou от Февраль 04, 2012, 16:21
Фактически надо увеличить theMax на разницу с вычисленным значением, но как это сделать атомарно... :-\


Название: Re: Максимальное значение
Отправлено: mutineer от Февраль 04, 2012, 16:27
Ты хочешь получить ответ как это оптимизировать или просто тыкнуть форумчан носом в "а вот я знаю, а вы нет :-P" ? Из топика не очень понятно


Название: Re: Максимальное значение
Отправлено: Igors от Февраль 04, 2012, 19:40
Ты хочешь получить ответ как это оптимизировать или просто тыкнуть форумчан носом в "а вот я знаю, а вы нет :-P" ? Из топика не очень понятно
Я сам очень не люблю когда "знаток" чего-то вычитал и потом на понтах типа "ты не знаешь а вот я (Я) знаю!". Но это я нигде не читал, просто случайно заметил. Приведенный мною код плохой и его можно заметно улучшить - не привлекая никаких тулзов.


Название: Re: Максимальное значение
Отправлено: mutineer от Февраль 04, 2012, 21:17
Приведенный мною код плохой и его можно заметно улучшить - не привлекая никаких тулзов.

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


Название: Re: Максимальное значение
Отправлено: LisandreL от Февраль 04, 2012, 21:32
Ну если знать, что над theMax других операций (которые его могут уменьшить) можно так:
Код:
if (value > theMax )             // не делаем лок, когда это точно не нужно
{
    QMutexLocker lock(&mutex);   // защищаем установку глобальной переменной theMax
    if (value > theMax)             // устанавливаем theMax
    {
        theMax = value;
    }
}
Но справедливо толко если на платформе присваивание double на целевой платформе атамарно.


Название: Re: Максимальное значение
Отправлено: Igors от Февраль 05, 2012, 09:13
Ну если знать, что над theMax других операций (которые его могут уменьшить) можно так:
вставьте "нет" (перед "других операций").

Да, это именно та "Америка" которую я открыл  :)

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

Edit: а, понял о чем Вы. Если напр double хранится в виде старшая часть + младшая (как long на первых PC). Но трудновато представить машину с 2 и более процессорами которая однако не имеет FPU регистров  :)


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

Но трудновато представить машину с 2 и более процессорами которая однако не имеет FPU регистров.
Это да.


Название: Re: Максимальное значение
Отправлено: pastor от Февраль 05, 2012, 16:01
В одном топике уже говорил и снова повторюсь: нет абсолютно никаких гарантий, что операция присваения double атомарна и это не должно вобще рассматриваться как упрощение\улучшение кода первого поста (убрать мютех).

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

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



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

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

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

Кто собственно мешает просто обсуждать что интересно? Почему хорошим тоном de-facto считается мгновенно выданный ответ (из букваря)? А подумать? А обсудить?


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


Название: Re: Максимальное значение
Отправлено: TaIRou от Февраль 05, 2012, 17:45
Просто в первом посте читался скорее вызов, нежели предложение к обсуждению ;D


Название: Re: Максимальное значение
Отправлено: Igors от Февраль 05, 2012, 18:34
Просто в первом посте читался скорее вызов, нежели предложение к обсуждению ;D
Ну не без этого :) Но я ж думаю - вещь очевидная, наверно все грамотные ее уже давно знают, это я велосипед изобрел :) И что плохого в (корректном) вызове?

Если вопрос из букваря, то почему ответ должен быть не оттуда? Ты недавно Андрюшку Александреску не читал?
Прием этот был описан еще в далеком 1996 году и назван..
Ага, наш главный учитель оказывается оказывается живой :)  Та я не спорю что прием известен (потому что должен быть). Но никто не мешал ответить как просто и убедительно это сделал LisandreL. Ну не успели, понимаю


Название: Re: Максимальное значение
Отправлено: BRE от Февраль 05, 2012, 18:38
Но никто не мешал ответить как просто и убедительно это сделал LisandreL. Ну не успели, понимаю
В очередной раз посоветовать тебе почитать книги? Ну так надоело уже... сколько можно. :)


Название: Re: Максимальное значение
Отправлено: Igors от Февраль 05, 2012, 19:10
В очередной раз посоветовать тебе почитать книги? Ну так надоело уже... сколько можно. :)
А я что делаю? С декабря прочитал минимум 8 Phd диссертаций, пытаюсь осмыслить - но без особого успеха :) Говорится много, и вроде бы убедительно, а реального алгоритма нет. Работа  :)


Название: Re: Максимальное значение
Отправлено: Igors от Февраль 05, 2012, 20:27
Да и вообще шлифовать решение - дело хорошее. У меня самого масса идей как бы получше обустроить. При этом, однако, подразумевается, что какое-то (пусть черновое) решение - уже есть. Но оно не всегда так. Вот например
http://www.prog.org.ru/index.php?topic=20851.msg142539#msg142539
Эта задача известна в теории как "splattering" (дословный перевод "разбрызгивание") но та же теория ничего не говорит о том как ее "разпоточить" :) Есть идеи/задумки? (пусть кривые - обсудим). Все лучше чем пилить букварь как дятлы  :)


Название: Re: Максимальное значение
Отправлено: Авварон от Февраль 05, 2012, 20:36
как он меня заебал


Название: Re: Максимальное значение
Отправлено: alexman от Февраль 05, 2012, 21:40
Да ладно нормальная тема заставить подумать окружающих. А то много тем "левых"... Думаю, просто надо поменьше под***ть народ...и флуд уйдет. Я, например, этот прием еще не встречал.


Название: Re: Максимальное значение
Отправлено: Авварон от Февраль 05, 2012, 22:23
Этот прием абсолютно очевиден, если вы писали синглтоны и удосужились прочитать хоть что-нибудь о том, как их писать (хотя бы того же александреску и его статью о синглтонах)
Меня "немного" раздражает то, что окружающим _постоянно_ говорят что они умеют только ответы из букваря давать. Я вот последний месяц оптимизировал самописную бд, причем оптимизировал настолько, что то, что у единственного конкурента занимает полчаса, у нас делается за 15 секунд. Но я не бегу понтоваться на форум и выкладывать мозголомные задачки, к-ые появились в процессе работы.


Название: Re: Максимальное значение
Отправлено: alexman от Февраль 05, 2012, 22:26
Я честно признался что не помню данного приема, а вы начинаете понтарезить... не хорошо.


Название: Re: Максимальное значение
Отправлено: Авварон от Февраль 05, 2012, 22:28
Я честно признался что не помню данного приема, а вы начинаете понтарезить... не хорошо.

Честно говоря, это было первое, что пришло в голову, но я подумал, что это слишком очевидно, и правильный ответ кроется в атомарности присваиваний, в результате чего и написал ту фигню.


Название: Re: Максимальное значение
Отправлено: Igors от Февраль 06, 2012, 19:10
...Но я не бегу понтоваться на форум и выкладывать мозголомные задачки,
Я сожалею что эта задачка сокрушила Ваш мозг  :)

Честно говоря, это было первое, что пришло в голову, но я подумал, что это слишком очевидно, и правильный ответ кроется в атомарности присваиваний, в результате чего и написал ту фигню.
Это совершенно нормально, на такие грабли я наступал много раз - и буду еще, multi-threading капитально "выносит моск". Ошибаются все, не злитесь.

Этот прием абсолютно очевиден, если вы писали синглтоны и удосужились прочитать хоть что-нибудь о том, как их писать (хотя бы того же александреску и его статью о синглтонах)
Ну знать приемы и уметь их (к месту) применять - все-таки разные вещи. Кстати дайте ссылку на статью (если не трудно).