0
我想创建一个线程,通过条件变量得到通知来执行一些代码。我跳上线程类成员函数是这样的:绑定条件谓词块的子线程
m_dbSaver = std::thread(std::bind(&ContactLearningApp::DBWorkerThread, this));
m_lk = std::unique_lock<std::mutex>(m_mutex);
m_Processed = true;
每隔半秒钟,我尝试运行的线程是这样的:
if (m_sampleClock.getTimeMilliseconds() > 500) {
printf("Save samples to DB\n");
// Wait for worker to finish processing
m_cv.wait(m_lk, [this] {return this->m_Processed; });
// Instruct thread to execute
m_Ready = true;
m_cv.notify_one();
m_sampleClock.reset();
}
我的工作线程looksl IKE在此:
void ContactLearningApp::DBWorkerThread() {
std::unique_lock<std::mutex> ul(m_mutex);
printf("Start worker thread. \n");
while (true) {
printf("Inside while loop and waiting. \n");
m_cv.wait(ul, [this] {return this->m_Ready; });
printf("Condition passed. \n");
m_Processed = false;
std::cout << "Worker thread processing data. " << std::endl;
m_Processed = true;
ul.unlock();
m_cv.notify_one();
}
}
即使将m_Ready谓词设置为true,工作线程也不会传递条件。如果在创建线程之前将m_Ready变量设置为true,则条件通过。我是否正确地做这件事?
那么删除ul.unlock()语句?这样它会有锁,然后释放它在等待声明? – terminix00
@ terminix00,不知道我在哪里移动了锁。 – Surt