2016-12-12 17 views
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,则条件通过。我是否正确地做这件事?

回答

0

第一次通过工作循环,你有锁,第二次你没有锁。

等待直到通知

当前线程(其中应 已锁定LCK的互斥)的执行被阻塞,直到收到通知。

它需要被锁定。

printf("Start worker thread. \n"); 
while (true) { 
    printf("Inside while loop and waiting. \n"); 
    std::unique_lock<std::mutex> ul(m_mutex); 
    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(); 
} 

这应该会提高你获得正确的机会。

+0

那么删除ul.unlock()语句?这样它会有锁,然后释放它在等待声明? – terminix00

+0

@ terminix00,不知道我在哪里移动了锁。 – Surt