Доброго времени суток.
В ядре Linux есть такой замечательный синхронизационный примитив, как rwsem (семафор читателей-писателей). Поскольку это семафор, количество операций down() и up() должно быть сбалансировано, т. е. up() нужно сделать столько раз, сколько было сделано down().
Вопрос: как «обойти» требование сбалансированности? Я хочу, чтобы любой поток имел возможность единовременно разлочить семафор. Дело в том, что счётчик семафора у меня уже есть (количество зарезервированных блоков в ФС), а от rwsem мне нужна только обёртка над счётчиком.
В голову приходит разве что потрясающе грязный вариант вида while (rwsem_is_locked(&foo)) up_read(&foo);
.
Или же, если счётчик уже есть, можно обойтись другим примитивом вместо rwsem?