android API 22上的互斥锁问题

时间:2017-02-09 21:23:56

标签: java android c++ multithreading android-ndk

我有一个生产者/消费者代码模型,如下所示:

std::queue<int> globalQueue;
std::mutex addmutex;

void ConsumerThread() {
    while(true) {
        bool isEmpty = false;
        {
            std::lock_guard<decltype(addmutex)> lock(addmutex);
            //std::cout << "Checking is empty" << std::endl
            isEmpty = globalQueue.empty();
        }
        .... //Further code to process
    }
}

void Producer(int value) {
    std::lock_guard<decltype(addmutex)> lock(addmutex);
    //std::this_thread::sleep_for(std::chrono::milliseconds(10000));
    globalQueue.push(value);
}

所以我注意到的奇怪的事情,这只是在API 22(API 23及以上工作正常)上,当生产者控制锁时,检查空时不会阻止使用者线程。我通过在消费者线程中添加一个print语句来验证这一点,如注释代码中所示,并通过延迟生成器线程post lock,如注释代码所示。结果就是即使某些东西被添加到队列中,消费者也总是认为它是空的。

在调用生产者时,我希望打印出“Checking is empty”停止10秒,它在API 23及更高版本上停止,但不在API 22上停止。

使用新的java线程从java代码启动使用者线程,该线程在启动时调用此新线程上的C ++ ConsumerThread方法以启动使用者。

我正在使用最新版本的NDK 13.1.3。

0 个答案:

没有答案