C ++ множественные блокировки одного и того же мьютекса из разных потоков - PullRequest
2 голосов
/ 05 июля 2019

У меня есть приложение для Android, которое использует JNI. Из Java есть вызовы методов JNI, написанных на C ++ 14. Однако проблема в том, что Java и Android используют несколько разных потоков, которые могут вызывать мой метод JNI одновременно из разных мест.

Под капотом, foo и bar манипулирует std::vector. Я не могу прочитать его в readVector, в то время как он изменяется в modifyVector, поэтому мне нужна блокировка.

Пока я использую

std::shared_timed_mutex m;

void modifyVector() {
   std::lock_guard<std::shared_timed_mutex> lk(m);

   //do some work - writer, modify std::vector -> only one thread allowed here
}

void readVector() {
   std::shared_lock<std::shared_timed_mutex> lk(m);

   //do some work - only reads from std::vector, multiple threads allowed here
}

Проблема в том, что modifyVector или readVector можно вызывать несколько раз из разных потоков Java, и я блокирую один и тот же мьютекс несколько раз, что вызывает частое зависание всего приложения. Я не знаю, является ли это тупиком или какой-либо другой проблемой, но я не знаю, как решить / отладить это. Я знаю, что существует рекурсивный мьютекс, но я думаю, что это вызовет проблемы с производительностью, поскольку modifyVector и readVector вызываются очень часто.

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

...