Перво-наперво: слово, которое вы ищете, это " recursive ".
Хотя GMutex
явно упоминает, что рекурсивный мьютекс не определен, AFAIK GRWLock
просто не упоминает, является ли блокировка writer рекурсивной (сторона считывателя рекурсивной).
Если немного погрузиться в реализацию, вы увидите, что в POSIX GRWLock
реализован с использованием pthread_rwlock_t
, , который не должен быть рекурсивным («Результаты не определены, если вызывающий поток удерживает блокировку чтения-записи (будь то блокировку чтения или записи) во время вызова. "). Так что в принципе нет, GRWLock
не является рекурсивным для блокировок писателя.
Что касается решения вашей проблемы, мое первое предложение было бы сделать так, чтобы mess_with_data
и mess_with_data_again
сами получили и сняли блокировку. Помните, что вы должны удерживать замки только столько, сколько необходимо и больше.
Если по какой-то причине это невозможно (например, если у вас нет доступа к этому коду), вы можете использовать рекурсивную блокировку или ограничить операции записи одним потоком и использовать очередь для взаимодействия с ним.
Также возможно реорганизовать mess_with_data
и mess_with_data_again
, чтобы они не требовали блокировок, но это может быть или не быть возможным и, вероятно, будет довольно трудным.