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