В настоящее время я разрабатываю кроссплатформенное серверное приложение C ++ (Linux / Windows) с крупномасштабным шаблоном синхронизации. Я внутренне использую boost :: thread как абстракцию специфичных для ОС потоков. Моя проблема - защитить массив данных, каждый элемент массива защищен независимой блокировкой чтения / записи .
Мой массив содержит 4096 элементов . Учитывая решение проблемы «читатели-писатели с приоритетом писателя», которое представлено в « Маленькой книге семафоров » (стр. 85), моему приложению потребуется 5 семафоров на элемент массива. Это дает в общей сложности около 20000 семафоров (или, что эквивалентно, 20000 мьютексов + 20000 условных переменных).
Дополнительная специфика моего приложения заключается в том, что в данный момент времени большинство семафоров неактивны (обычно имеется около 32 "клиентов") потоки, ожидающие / сигнализирующие о тысячах семафоров). Обратите внимание, что, поскольку весь сервер работает в одном процессе, я использую облегченные семафоры на основе потоков ( не семафоры между процессами).
У меня двоякий вопрос:
Рекомендуется ли создавать общий из 20000 семафоров в Linux и Windows для одного процесса? Ну, конечно, я думаю, что это не так ...
Если эта практика не рекомендуется, какой метод я могу использовать для уменьшения количества фактических семафоров, например создать набор из N «эмулированных семафоров» поверх 1 фактического семафора ? Я полагаю, что это было бы интересным решением, потому что большинство моих семафоров неактивны в данный момент.
Заранее спасибо!
Изучив исходный код Boost, я обнаружил, что:
. Причины этого мне не кажутся ясными. В частности, использование межпроцессных объектов для "boost :: shared_mutex" под Windows кажется мне неоптимальным.
]