Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218

Lock-free синхронизация: как организуется нотификация между потоками?

17.04.2016, 21:37. Показов 3377. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Хотелось бы услышать о реальном опыте, потому что теоретических советов в гугле много, но практика - она, как известно, штука такая...

Задумал перевести программку на многопоточную работу. Обмен данными предполагаю делать через общий кольцевой буфер: туда периодически поступают данные, а рабочим потокам в очередь ставится задание с указанием, где в этом буфере для них лежат данные. Вопрос: как потоки должны узнать, что в очереди появилось новое задание? Задание может поступать раз в минуту, а может и 10 000 раз в секунду, какой способ уведомлений самый быстрый и ест меньше ресурсов?

Мьютексы-шмьютексы сейчас не в моде, также как и блокирующая синхронизация. Раньше сделал бы через WaitForSingleObject, но он сейчас тоже критикуется, sleep(10) - теряется оперативность реакции, PostMessage - видится самым медленным из всех. Кто как делал? Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.04.2016, 21:37
Ответы с готовыми решениями:

Синхронизация между потоками
Вот, например у меня есть основной Ui поток и поток Thread который он породил. И Tread меняет какую то переменную (ну или массив целый) и я...

Синхронизация итераций между потоками
Добрый день. Сразу скажу, что облазил все доступные мне офф. доки по Qt и полгугла, но не нашел необходимых мне средств в Qt. Задача...

Синхронизация ресурса между потоками
Всем привет!) Возник вопрос.. незнаю как его решить.. Предположим есть класс A, с числовой переменной a + геттер\сеттер на нее. В...

29
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
18.04.2016, 11:11  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от mss Посмотреть сообщение
Опять же - зачем
Чтобы не дёргать QueueUserAPC лишний раз. В этом суть. Мы договорились, что число пакетов в секунду - тысячи (и плюс другим приложениям надо дать подышать). Получается тысячи вызовов QueueUserAPC против всего лишь одного.

Цитата Сообщение от mss Посмотреть сообщение
А если нить в этот момент читает буфер
Есть способы узнать, было ли это место перезаписано с момента постановки задания до момента окончания чтения. Счётчик записанных в буфер байт, например. Если он увеличился больше, чем на размер буфера, значит данные перезаписаны.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
18.04.2016, 11:13
Пускай рабочий поток висит на ожидании event-а. Когда event взводится в
сигнальное состояние, поток начинает в цикле забирать и обрабатывать данные
из очереди, до тех пор, пока там ничего не останется, после чего снова
уходит в ожидание.

Доступ к очереди синхронизируется легковесно, никаких мьютексов, критических
секций и т.п., просто спин-блокировка: захватил - вставил - отпустил, все, в
совокупности операция должна занимать считанные такты.

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

Если поток слишком часто уходит в sleep/wait, его пожно "подтюнить" с помощью
спин-ожидания, тогда прыжков в ядро и обратно будет меньше.

Если конкуренция за очередь с данными слишком высокая, ее можно распределить.
То есть, сделать несколько очередей, каждая со своей блокировкой и event-ом,
причем каждую очередь обслуживают строго определенные потоки.

Цитата Сообщение от mss Посмотреть сообщение
APC при прочих равных условиях позволит раб.нитям максимально быстро реагировать на наличие заданий в их собственных очередях
APC, как мне кажется, заметных выгод не даст, потому что в итоге дело все
равно сведется к прыжкам туда-обратно в ядро и переключению контекстов.
Ведь для того, чтобы выполнить APC, поток должен выполнить alertable wait...

Цитата Сообщение от Postscripter Посмотреть сообщение
Если что, речь о сетевых пакетах.
Если так, советую приглядеться к I/O Completion Ports - эта штуковина
специально заточена под такие сценарии.
1
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
18.04.2016, 11:25
Цитата Сообщение от Убежденный Посмотреть сообщение
для того, чтобы выполнить APC, поток должен выполнить alertable wait
Не должен при NtAlertThread.

Цитата Сообщение от Убежденный Посмотреть сообщение
заметных выгод не даст
Готовая же поддерживаемая на уровне ОС очередь - не нужно городить огород со своими очередями ..
Единственная неприятность - усложненная борьба утечками при прогнозируемом падении нити.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
18.04.2016, 11:36
Цитата Сообщение от mss Посмотреть сообщение
Не должен при NtAlertThread.
Предлагаешь крутить в цикле NtAlertThread?
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  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Готовая же поддерживаемая на уровне ОС очередь - не нужно городить огород со своими
Есть шанс, что моя очередь будет быстрее системной, если её тоже закольцевать и исключить таким образом операции выделения памяти.

Цитата Сообщение от Убежденный Посмотреть сообщение
Доступ к очереди синхронизируется легковесно
Согласен

Цитата Сообщение от Убежденный Посмотреть сообщение
APC, как мне кажется, заметных выгод не даст, потому что в итоге дело все
равно сведется к прыжкам туда-обратно в ядро
Цитата Сообщение от Убежденный Посмотреть сообщение
Пускай рабочий поток висит на ожидании event-а
Вот тут не понял. Ожидание event-а - это не прыжок в ядро? А установка? Event взводится через SetEvent постоянно, каждый раз по появлению новых данных? Это нормально?

PS системным программистам всегда завидовал)

Добавлено через 5 минут
Установку/сброс ведь нужно оборачивать в критич. секцию? Не так здорово получается.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
18.04.2016, 12:36
Цитата Сообщение от Postscripter Посмотреть сообщение
Установку/сброс ведь нужно оборачивать в критич. секцию?
Установку/сброс ивента ?
Нет, не нужно.
Равно как не нужно оборачивать и любые другие API-ф-ции, работающие любыми другими глобальными объектами синхронизации.
0
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
18.04.2016, 13:04  [ТС]
а, ну да. Чёт переглючило совсем. Пойду чаю выпью.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
18.04.2016, 14:28
Цитата Сообщение от Postscripter Посмотреть сообщение
Вот тут не понял. Ожидание event-а - это не прыжок в ядро? А установка?
Прыжок.
Но количество этих прыжков можно минимизировать.
В данном случае рабочие потоки будут уходить в ожидание только если в
очереди для них нет данных. Поток-producer, кстати говоря, также может
"объединять" несколько вызовов SetEvent в один, если данные идут с
высокой частотой. Т.е., к примеру, на 5 порций данных достаточно 1 раз
сделать SetEvent и они все будут вычитаны рабочими потоками.
0
9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218
18.04.2016, 14:42  [ТС]
Так вот я и хотел проверять - если рабочий поток сейчас работает (взведён флаг "я работаю"), event не ставить. Только тогда с синхронизацией флагов заморачиваться...

В целом видение сформировалось, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.04.2016, 14:42
Помогаю со студенческими работами здесь

lock-free vector
Собственно вопрос, есть ли реализации lock free вектора?

Многопоточность - синхронизация - lock
Изучаю многопоточность, дошел до синхронизация и не могу понять как использовать lock, вот делаю программу для теста lock: using...

Acer aspire 5552G-N974G64Mikk Проблема с Caps Lock, Num Lock, Scroll Lock
Вообщем у меня такая же проблемма https://www.cyberforum.ru/notebooks/thread552722.html Небольшая проблема на ноутбуке, когда...

Вывести на экран в символическом виде состояние NUM LOCK, CAPS LOCK и SCROLL LOCK
Помогите решить задачку на турбо си Выводить на экран в символическом виде состояние NUM LOCK, CAPS LOCK и SCROLL LOCK (вкл. / выкл.),...

Клавиатура мигает всеми тремя индикаторами Caps Lock, Scroll Lock и Num Lock и соответственно не работает!
Здравствуйте парни и девушки! Столкнулся с такой проблемой! Имеется клавиатура Genius Ergomedia 700! Так вот. Начал замечать интересную...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
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, навеянное сном в майский день. Для работы необходим браузер,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru