я небольшие сомнения нити будучи проснулись и недоступность замкапропустил сигнал в 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::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_thread() помещает данные в очереди и уведомляет и ожидание очереди на condition_variable.
Мой вопрос, если другая нить просыпается и обнаруживает, что связанный мьютекс все еще недоступен, он снова спит. Разве это не состояние пропущенного сигнала?