Найти в Дзене
188 подписчиков

МЕТОДЫ ПРОГ. ИНЖЕНЕРИИ, МЕЖПОТОЧНОЕ ВЗАИМОДЕЙСТВИЕ


В этом посте хотел бы освятить один из методов программной инженерии, в частности что касается межпоточного взаимодействия. Не буду говорить насколько актуально межпоточное взаимодействие в современных многоядерных серверах, это отдельная тема.

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

На рисунке "pl" это буфер с выводимыми данными в лог, клиент их пишет, периодически перезаписывает, серверный поток только читает и копирует к себе. Целочисленный счётчик "iw_cli" это порядковый номер блока записанных данных в "pl", "ir_ser" это порядковый номер прочитанных данных из "pl". Если "iw_cli" > "ir_ser", то клиент не может писать новые данные в "pl" для сервера и ждёт когда это неравенство исчезнет, сервер может читать безопасно данные из "pl". Если "iw_cli" = "ir_ser", то клиент может писать в "pl" новые данные, а сервер ждёт когда это равенство исчезнет. Счётчик "iw_cli" пишет только клиент, сервер может его только читать, счётчик "ir_ser" пишет только сервер, клиент его может только читать.

При переполнении целого числа после 0x7fffffff или после 0xffffffff счётчики возвращаются к нулю. Есть выражения которые учитывают это так что с этим проблем нет. Такой вот метод, надеюсь он будет кому-нибудь полезен.
МЕТОДЫ ПРОГ. ИНЖЕНЕРИИ, МЕЖПОТОЧНОЕ ВЗАИМОДЕЙСТВИЕ  В этом посте хотел бы освятить один из методов программной инженерии, в частности что касается межпоточного взаимодействия.
1 минута