来自不同线程的同一个互斥锁的C ++多个锁

时间:2019-07-05 11:01:35

标签: java android multithreading c++14

我有一个使用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
}

问题是,modifyVectorreadVector可以从不同的Java线程中多次调用,而我多次锁定同一个互斥锁,这导致整个应用程序经常冻结。我不知道这是一个死锁还是其他问题,但是我不知道如何解决/调试这个问题。我知道有一个递归互斥体,但是我认为它会导致性能问题,因为modifyVectorreadVector经常被调用。

我一直在尝试查找有关此问题的教程或其他内容,但通常会发现“单一生产者-多个消费者”类型的问题,我认为这不适用于我的问题。

0 个答案:

没有答案