Мы обнаружили, что у нас есть несколько точек в нашем коде, где параллельные чтения данных, защищенных мьютексом, довольно распространены, в то время как записи встречаются редко. Наши измерения, по-видимому, говорят о том, что использование простого мьютекса серьезно препятствует производительности кода, считывающего эти данные. Итак, нам нужен многоточечный/однозадачный мьютекс. Я знаю, что это может быть построено поверх простых примитивов, но прежде чем я попытаюсь это сделать, я скорее попрошу существующие знания:
Что такое одобренный способ создания блокировки с несколькими чтениями/одиночной записью из более простых примитивов синхронизации?
У меня есть идея, как это сделать, но я бы предпочел, чтобы ответы были непредвзятыми из-за того, что я (возможно, ошибочно) придумал. (Примечание: то, что я ожидаю, объясняет, как это сделать, возможно, в псевдокоде, а не в полноценной реализации. Я, конечно, могу написать код сам.)
Предостережения:
-
Это должно иметь разумную производительность. (Мне нужно иметь две операции блокировки/разблокировки для каждого доступа. Теперь это может быть недостаточно, но многие из них кажутся необоснованными.)
-
Обычно чтение более многочисленное, но записи более важны и чувствительны к производительности, чем чтение. Читатели не должны голодать писателям.
-
Мы застряли на довольно старой встроенной платформе (проприетарный вариант VxWorks 5.5), с довольно старым компилятором (GCC 4.1.2) и повышаем уровень 1.52 - за исключением большинства блоков повышения, основанных на POSIX, потому что POSIX не полностью реализована на этой платформе. Доступные в принципе блокирующие примитивы представляют собой несколько семафоров (двоичные, подсчетные и т.д.), Поверх которых мы уже создали мьютексы, переменные условий и мониторы.
-
Это IA32, одноядерный.