Multithreading c++11条件变量中的缺失信号

Multithreading c++11条件变量中的缺失信号,multithreading,c++11,Multithreading,C++11,我对线程被唤醒和锁不可用有点怀疑 std::mutex mut; std::queue<data_chunk> data_queue; std::condition_variable data_cond; void data_preparation_thread() { while(more_data_to_prepare()) { data_chunk const data=prepare_data();

我对线程被唤醒和锁不可用有点怀疑

std::mutex mut; 
std::queue<data_chunk> data_queue;   
std::condition_variable data_cond;

void data_preparation_thread() {    
    while(more_data_to_prepare())    {        
        data_chunk const data=prepare_data();        
        std::lock_guard<std::mutex> lk(mut);        
        data_queue.push(data);                      
        data_cond.notify_one(); //mutex is still locked here      
    }
}

void data_processing_thread() {
    while(true)    {
        std::unique_lock<std::mutex> lk(mut); 
        data_cond.wait(lk,[]{return !data_queue.empty();}); //what if lk could not acquire the mutex.
        data_chunk data=data_queue.front();        
        data_queue.pop();        
        lk.unlock();
        process(data);
        if(is_last_chunk(data))
            break;
    }
}

在上面的示例中,data_preparation_线程将数据放入队列,并通知和线程等待condition_变量

我的问题是,如果另一个线程醒来发现关联的互斥仍然不可用,它会再次休眠。这不是信号丢失的情况吗

如果另一个线程唤醒并发现关联的互斥仍然不可用,它将再次休眠

一旦它重新获得互斥锁,它就开始测试条件

条件变量通知本质上是提示条件可能已更改,需要重新评估。可能有。代码等待条件变为真,而不是信号

如果另一个线程唤醒并发现关联的互斥仍然不可用,它将再次休眠

一旦它重新获得互斥锁,它就开始测试条件


条件变量通知本质上是提示条件可能已更改,需要重新评估。可能有。代码等待条件变为真,而不是信号。

在条件变量上休眠(即等待信号)和在互斥体上休眠(即等待锁定信号)之间存在差异

如果线程从等待条件变量中唤醒,并且互斥体仍然被锁定,它将开始等待互斥体,直到它能够获取它,然后检查条件,即谓词。这与再次等待condvar不同,因此没有遗漏任何内容。它仍在等待检查该条件是否为真,在获取互斥锁之前无法执行此操作


假设您在唤醒时正确地检查了条件,这是您传递给条件变量::wait的谓词所做的,那么您就不会错过导致信号的事件。

在条件变量上睡眠(即等待信号)和在互斥体上睡眠(即等待锁定信号)之间有区别

如果线程从等待条件变量中唤醒,并且互斥体仍然被锁定,它将开始等待互斥体,直到它能够获取它,然后检查条件,即谓词。这与再次等待condvar不同,因此没有遗漏任何内容。它仍在等待检查该条件是否为真,在获取互斥锁之前无法执行此操作

假设您在唤醒时正确地检查了条件,这是您传递给条件变量::wait的谓词所做的,那么您就不会错过导致该信号的事件