Russian Qt Forum
Ноябрь 23, 2024, 20:27
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
QAtomicInt vs. QMutex
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QAtomicInt vs. QMutex (Прочитано 16461 раз)
once_again_abc
Гость
QAtomicInt vs. QMutex
«
:
Сентябрь 09, 2011, 04:43 »
Что быстрее - обращение к переменной через QMutex.lock/unlock или к переменной типа QAtomicInt через testAndSetRelaxed?
Записан
brankovic
Гость
Re: QAtomicInt vs. QMutex
«
Ответ #1 :
Сентябрь 09, 2011, 09:45 »
В лучшем для мьютекса случае обращение через test_and_set 'быстрее' в 2 раза (в мьютексе выполнится минимум 2 test_and_set независимо от реализации, но в не-линуксах может быть и больше). В худшем случае мьютекс может быть сколь угодно медленнее. Но это большая и сложная тема, 'быстрее' тут почти бессмысленное понятие.
«
Последнее редактирование: Сентябрь 09, 2011, 11:29 от brankovic
»
Записан
once_again_abc
Гость
Re: QAtomicInt vs. QMutex
«
Ответ #2 :
Сентябрь 09, 2011, 11:02 »
Цитата: brankovic от Сентябрь 09, 2011, 09:45
В лучшем случае для мьютекса обращение через test_and_set 'быстрее' в 2 раза (в мьютексе выполнится минимум 2 test_and_set независимо от реализации, но в не-линуксах может быть и больше). В худшем случае мьютекс может быть сколь угодно медленнее. Но это большая и сложная тема, 'быстрее' тут быстрее почти бессмысленное понятие.
есть общие практики использования того и другого? каковы критерии выбора в зависимости от ситуации?
Записан
brankovic
Гость
Re: QAtomicInt vs. QMutex
«
Ответ #3 :
Сентябрь 09, 2011, 11:14 »
Правило номер 1: никогда не используйте атомарные операции
Правило номер 2: никогда не используйте атомарные операции
Правило номер 3: в реальном проекте за использование атомарных операций отрубают руки по локоть
Если серьёзно, то пару раз видел очень эффективное использования кода на атомиках, но 1. код не простой, 2. убедить коллег что имеет смысл с этим связываться ещё сложнее. Короче использовать надо только если вы точно знаете, что это что-то даст, например если треды много времени ждут в локах.
Кстати, ваш другой давешний вопрос про QSettings тоже можно решить атомиками, но решение с read-write локерами всё же предпочтительнее из-за простоты и наглядности.
«
Последнее редактирование: Сентябрь 09, 2011, 11:18 от brankovic
»
Записан
once_again_abc
Гость
Re: QAtomicInt vs. QMutex
«
Ответ #4 :
Сентябрь 09, 2011, 11:36 »
Цитата: brankovic от Сентябрь 09, 2011, 11:14
Правило номер 1: никогда не используйте атомарные операции
Правило номер 2: никогда не используйте атомарные операции
Правило номер 3: в реальном проекте за использование атомарных операций отрубают руки по локоть
как-то несерьезно. чем обоснованны эти правила?
Цитата: brankovic от Сентябрь 09, 2011, 11:14
Если серьёзно, то пару раз видел очень эффективное использования кода на атомиках, но 1. код не простой, 2. убедить коллег что имеет смысл с этим связываться ещё сложнее. Короче использовать надо только если вы точно знаете, что это что-то даст, например если треды много времени ждут в локах.
не понял ваш "например". не могли бы пояснить, что вы здесь имели ввиду?
Записан
brankovic
Гость
Re: QAtomicInt vs. QMutex
«
Ответ #5 :
Сентябрь 09, 2011, 11:57 »
Цитата: once_again_abc от Сентябрь 09, 2011, 11:36
как-то несерьезно. чем обоснованны эти правила?
правила получены опытным путём. Обычно реализация даже простого алгоритма (например обычный стек) на атомиках занимает много времени и тянет за собой шлейф трудно исправимых багов.
Сравнение atomic vs. locks сводится к следующему: мьютексы использовать проще, атомики потенциально эффективнее. Дальше следует выяснить насколько эффективнее. Оказывается не сильно, скажем ускорение на 50% в специфических местах может дать 5 или 1% для всей программы. А сложность алгоритмов на атомарных операциях буквально в разы больше. На поддержку такого кода обычно нет ресурсов. Это с точки зрения бизнеса. Теперь с вашей личной точки зрения. Допустим вы убьёте 2 недели на ускорение программы на 1%, оно вам надо? Как правило нет.
Edit: но есть конечно implicit sharing, shared_ptr и прочие полезные вещи, которые без атомиков не реализуешь. Обычно их кто-то до вас уже реализовал, нужно просто воспользоваться.
Цитата: once_again_abc от Сентябрь 09, 2011, 11:36
Цитата: brankovic от Сентябрь 09, 2011, 11:14
например если треды много времени ждут в локах.
не понял ваш "например". не могли бы пояснить, что вы здесь имели ввиду?
Если в приложении есть мьютексы-боттлнеки, т.е. места где много тредов ждут один тред захвативший мьютекс или просто очень часто треды 'сталкиваются' (т.е. засыпают из-за занятости мьютекса). Находятся такие проблемы как профилированием, так и умозрительно, поскольку профилировать такое не всегда получается.
«
Последнее редактирование: Сентябрь 09, 2011, 18:07 от brankovic
»
Записан
once_again_abc
Гость
Re: QAtomicInt vs. QMutex
«
Ответ #6 :
Сентябрь 09, 2011, 12:35 »
Цитата: brankovic от Сентябрь 09, 2011, 11:57
...
Спасибо!
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QAtomicInt vs. QMutex
«
Ответ #7 :
Сентябрь 09, 2011, 13:09 »
Цитата: brankovic от Сентябрь 09, 2011, 11:57
..поскольку профилировать такое не всегда получается.
Ну вот зачем так на самое больное место?
Цитата: once_again_abc от Сентябрь 09, 2011, 11:36
как-то несерьезно. чем обоснованны эти правила?
Цитата: once_again_abc от Сентябрь 09, 2011, 12:35
Спасибо!
Вы немного поэкспериментируйте, и, возможно, после этого ответы Вам уже не покажутся странными/смешными. Возьмите просто вектор, заполните его и запустите 10 ниток которые только и делают что пишут в этот вектор под защитой прекрасной, удобной конструкции напр так
Код
C++ (Qt)
QMutexLocker
locker
(
&
theMutex
)
;
theVector
[
0
]
=
1
;
И посмотрите что у Вас со скоростью - а потом, если будет желание, обсудим и atomic.
А если у Вас не найдется 15 минут чтобы это проверить - ну значит и разговор несерьезный
Записан
Akon
Гость
Re: QAtomicInt vs. QMutex
«
Ответ #8 :
Сентябрь 09, 2011, 17:56 »
Есть задачи, где без атомиков очень плохо, например, подсчет ссылок, а в целом согласен с brankovic.
«
Последнее редактирование: Сентябрь 09, 2011, 17:58 от Akon
»
Записан
once_again_abc
Гость
Re: QAtomicInt vs. QMutex
«
Ответ #9 :
Сентябрь 14, 2011, 03:06 »
да, кьютишные семафоры и мьютексы довольно медленная штука.
использовал QAtomicInt + QAtomicPointer для неблокирующего кольцевого буфера в консьюмер-продюсер алгоритме.
Записан
BRE
Гость
Re: QAtomicInt vs. QMutex
«
Ответ #10 :
Сентябрь 14, 2011, 07:18 »
Цитата: once_again_abc от Сентябрь 14, 2011, 03:06
да, кьютишные семафоры и мьютексы довольно медленная штука.
Нет никаких "кьютишные семафоры и мьютексы"! Эти классы в Qt всего лишь врапперы над системными объектами.
Записан
once_again_abc
Гость
Re: QAtomicInt vs. QMutex
«
Ответ #11 :
Сентябрь 14, 2011, 08:08 »
Цитата: BRE от Сентябрь 14, 2011, 07:18
Цитата: once_again_abc от Сентябрь 14, 2011, 03:06
да, кьютишные семафоры и мьютексы довольно медленная штука.
Нет никаких "кьютишные семафоры и мьютексы"! Эти классы в Qt всего лишь врапперы над системными объектами.
я в курсе и это вообще то очевидно. зачем об этом говорить, да еще так(!) эмоционально? =)
Записан
BRE
Гость
Re: QAtomicInt vs. QMutex
«
Ответ #12 :
Сентябрь 14, 2011, 08:58 »
Цитата: once_again_abc от Сентябрь 14, 2011, 08:08
я в курсе и это вообще то очевидно. зачем об этом говорить, да еще так(!) эмоционально? =)
Потому что уже надоело читать про тормозящие кьютешные треды, мьютексы и сокеты.
Насчет мьютексов... если их сравнивать с атомарными операциями, то они всегда будут медленней последних, но и задачи они выполняют разные.
Задачу можно постараться решить так, что бы время ожидания на объектах синхронизации было минимально и им можно было просто пренебречь.
Вот для примера, если посмотреть на то, что предлагает проверить Igors в посте # 7. Время расчета значения в каждом треде соизмеримо (в этом случае даже меньше) с временем помещения этого значения в вектор. Тут и пробовать ничего не надо, и так понятно что все нитки кроме одной будут просто ждать на мьютексе и мы получим не ускорение, а заметные тормоза.
Но если изменить алгоритм и каждой нитке указать диапазон вектора для заполнения, то они все сразу заработают параллельно не мешая друг другу (да и объекты синхронизации уже не понадобятся). Или каждая нитка может заполнить свой внутренний вектор порцией данных, а мотом под защитой мьютекса добавить его в общий вектор и вернутся к заполнению внутреннего.
В общем нужно стараться, что бы нитки больше работали и меньше взаимодействовали.
Записан
BRE
Гость
Re: QAtomicInt vs. QMutex
«
Ответ #13 :
Сентябрь 14, 2011, 09:11 »
И да, я не противник атомарных операций, при возможности с удовольствием пользую.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QAtomicInt vs. QMutex
«
Ответ #14 :
Сентябрь 14, 2011, 09:52 »
Цитата: BRE от Сентябрь 14, 2011, 08:58
Насчет мьютексов... если их сравнивать с атомарными операциями, то ..
Мутекс блокирует нитки, атомарные операции нет, эти вещи не взаимозаменяемы. Поэтому их сравнение бессмысленно, как и название топика.
Цитата: BRE от Сентябрь 14, 2011, 08:58
Вот для примера, если посмотреть на то, что предлагает проверить Igors в посте # 7. Время расчета значения в каждом треде соизмеримо (в этом случае даже меньше) с временем помещения этого значения в вектор. Тут и пробовать ничего не надо, и так понятно что все нитки кроме одной будут просто ждать на мьютексе и мы получим не ускорение, а заметные тормоза.
Вот пока "и так все ясно" (т.е. не проверено, не прочувствовано на опыте) - толку никакого
Насколько (во сколько раз) время расчета должно быть больше, чтобы мутекс на общем контейнере работал удовлетворительно? (напр 4 нитки, требуемый КПД хотя бы 300%). Что выигрывается с QReadWriteLocker (напр соотношение 3 чтения и 1 запись)? Но я так вижу это неинтересно проверять. Куда проще что-то прочитать/услышать и поддержать разговор напр так
Цитата: once_again_abc от Сентябрь 14, 2011, 03:06
да, кьютишные семафоры и мьютексы довольно медленная штука.
Цитата: BRE от Сентябрь 14, 2011, 08:58
Но если изменить алгоритм и ..
Ну так это может быть очень недешево (с точки зрения написания)
Возвращаясь к теме - плохо что Qt имеет только "честный" мутекс (fair mutex). Во многих случаях удается успешно проскочить с нечестным (unfair который не останавливает нитку) вместо дорогостоящей переделки алгоритма.
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...