我有一个使用JNI的Android应用。从Java调用了用C ++ 14编写的JNI方法。但是,问题是,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
经常被调用。
我一直在尝试查找有关此问题的教程或其他内容,但通常会发现“单一生产者-多个消费者”类型的问题,我认为这不适用于我的问题。