es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Debería el método empty() de C++11 STL::LIST bloquearse en una situación de subprocesos múltiples?

En C++, el hilo 1 solo realiza push_back(data) en LIST, y el hilo 2 solo realiza pop_front(data) de LIST. ¿Es necesario bloquear empty() en el hilo 2? Solo me preocupo por la situación en la que LIST esté vacío pero empty() devuelva false. ¿Esta preocupación es innecesaria?

“`
list<my_struct> buffer;

static void recibirDatos(my_struct &data) {
mutex.lock();
buffer.push_back(data);
mutex.unlock();
}

static void enviarDatos() {
while(1) {
if (buffer.empty()) {
continue;
}
mutex.lock();
buffer.pop_front();
mutex.unlock();
}
}
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, deberías bloquear empty() en el hilo 2. Esto se debe a que incluso si el hilo 1 solo está insertando datos en la lista y el hilo 2 solo está eliminando datos de la lista, todavía existe la posibilidad de que el hilo 2 pueda comprobar la función empty() mientras el hilo 1 está en medio de insertar datos. Esto podría resultar en que empty() devuelva falso aunque en ese momento la lista esté técnicamente vacía. Por lo tanto, es importante tener bloqueada la función empty() para evitar cualquier posible condición de carrera. Tu preocupación no es innecesaria.

Comments are closed.