9 / 9 / 1
Регистрация: 04.07.2012
Сообщений: 218

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

17.04.2016, 21:37. Показов 3560. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru