|
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
|
|
Lock-free синхронизация: как организуется нотификация между потоками?17.04.2016, 21:37. Показов 3377. Ответов 29
Метки нет (Все метки)
Добрый день!
Хотелось бы услышать о реальном опыте, потому что теоретических советов в гугле много, но практика - она, как известно, штука такая... Задумал перевести программку на многопоточную работу. Обмен данными предполагаю делать через общий кольцевой буфер: туда периодически поступают данные, а рабочим потокам в очередь ставится задание с указанием, где в этом буфере для них лежат данные. Вопрос: как потоки должны узнать, что в очереди появилось новое задание? Задание может поступать раз в минуту, а может и 10 000 раз в секунду, какой способ уведомлений самый быстрый и ест меньше ресурсов? Мьютексы-шмьютексы сейчас не в моде, также как и блокирующая синхронизация. Раньше сделал бы через WaitForSingleObject, но он сейчас тоже критикуется, sleep(10) - теряется оперативность реакции, PostMessage - видится самым медленным из всех. Кто как делал? Спасибо.
0
|
|
| 17.04.2016, 21:37 | |
|
Ответы с готовыми решениями:
29
Синхронизация между потоками Синхронизация итераций между потоками Синхронизация ресурса между потоками |
|
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
|
|||
| 18.04.2016, 11:11 [ТС] | |||
|
0
|
|||
|
Ушел с форума
|
|||
| 18.04.2016, 11:13 | |||
|
Пускай рабочий поток висит на ожидании event-а. Когда event взводится в
сигнальное состояние, поток начинает в цикле забирать и обрабатывать данные из очереди, до тех пор, пока там ничего не останется, после чего снова уходит в ожидание. Доступ к очереди синхронизируется легковесно, никаких мьютексов, критических секций и т.п., просто спин-блокировка: захватил - вставил - отпустил, все, в совокупности операция должна занимать считанные такты. Это вполне нормальная рабочая схема, которая подойдет для подавляющего большинства сценариев такого плана. Количество рабочих потоков обычно ставят равным количеству ядер/процессоров, хотя иногда другое соотношение может дать лучшие результаты (зависит от специфики). Если поток слишком часто уходит в sleep/wait, его пожно "подтюнить" с помощью спин-ожидания, тогда прыжков в ядро и обратно будет меньше. Если конкуренция за очередь с данными слишком высокая, ее можно распределить. То есть, сделать несколько очередей, каждая со своей блокировкой и event-ом, причем каждую очередь обслуживают строго определенные потоки. равно сведется к прыжкам туда-обратно в ядро и переключению контекстов. Ведь для того, чтобы выполнить APC, поток должен выполнить alertable wait... специально заточена под такие сценарии.
1
|
|||
|
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
|
|||
| 18.04.2016, 11:25 | |||
|
Единственная неприятность - усложненная борьба утечками при прогнозируемом падении нити.
0
|
|||
|
Ушел с форума
|
|
| 18.04.2016, 11:36 | |
|
0
|
|
|
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
|
|
| 18.04.2016, 11:51 | |
|
ну можно разбавить пустым слипом, дабы выровнять образующийся перекос в квантовании конкурентных нитей ..
0
|
|
|
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
|
|||||
| 18.04.2016, 12:27 [ТС] | |||||
|
PS системным программистам всегда завидовал) Добавлено через 5 минут Установку/сброс ведь нужно оборачивать в критич. секцию? Не так здорово получается.
0
|
|||||
|
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
|
||
| 18.04.2016, 12:36 | ||
|
Нет, не нужно. Равно как не нужно оборачивать и любые другие API-ф-ции, работающие любыми другими глобальными объектами синхронизации.
0
|
||
|
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
|
|
| 18.04.2016, 13:04 [ТС] | |
|
а, ну да. Чёт переглючило совсем. Пойду чаю выпью.
0
|
|
|
Ушел с форума
|
||
| 18.04.2016, 14:28 | ||
|
Но количество этих прыжков можно минимизировать. В данном случае рабочие потоки будут уходить в ожидание только если в очереди для них нет данных. Поток-producer, кстати говоря, также может "объединять" несколько вызовов SetEvent в один, если данные идут с высокой частотой. Т.е., к примеру, на 5 порций данных достаточно 1 раз сделать SetEvent и они все будут вычитаны рабочими потоками.
0
|
||
|
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
|
|
| 18.04.2016, 14:42 [ТС] | |
|
Так вот я и хотел проверять - если рабочий поток сейчас работает (взведён флаг "я работаю"), event не ставить. Только тогда с синхронизацией флагов заморачиваться...
В целом видение сформировалось, спасибо.
0
|
|
| 18.04.2016, 14:42 | |
|
Помогаю со студенческими работами здесь
30
lock-free vector Многопоточность - синхронизация - lock Acer aspire 5552G-N974G64Mikk Проблема с Caps Lock, Num Lock, Scroll Lock
Клавиатура мигает всеми тремя индикаторами Caps Lock, Scroll Lock и Num Lock и соответственно не работает! Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы
Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
|
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция
Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
|
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
|
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
|
|
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
|
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика
Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
|
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации:
В классе Работник добавить:
накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни
коэффициентПрезентеизма — снижает продуктивность. . .
|
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день.
Для работы необходим браузер,. . .
|