No tengo el valgrind y estoy con el Visual Studio, pero veo dos cosas:
1) [que no tiene nada que ver con tu pregunta, pero...] La función void print(ostream& s) no debería poder invocarse con un argumento temporal (un prvalue), como en
Por alguna extraña razón tu compilador lo permite. Supongo que puedes sobrecargar la función print con una versión que acepte una rvalue reference:
Y 2) en
el predicado
1) [que no tiene nada que ver con tu pregunta, pero...] La función void print(ostream& s) no debería poder invocarse con un argumento temporal (un prvalue), como en
Código [Seleccionar]
print(stringstream() << "Producer " << producer_id << " produced " << product << "\n");
Por alguna extraña razón tu compilador lo permite. Supongo que puedes sobrecargar la función print con una versión que acepte una rvalue reference:
Citarvoid print(ostream&& s) {
cout << s.rdbuf() << flush;
s.clear();
}
Y 2) en
Código (cpp) [Seleccionar]
is_not_full.wait(lock, [] { return products.size() != max_products; });
el predicado
Citarproducts.size() != max_products;no garantiza que el lock no se levante debido a un wakeup espurio, haciendo que se intente ejecutar el push() por dos o más threads simultáneamente.