我有一个生产者/消费者代码模型,如下所示:
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。