Soy un recién llegado a la biblioteca de Boost, y estoy tratando de implementar un simple productor y los hilos de consumo que operan en una cola compartida. Mi ejemplo de implementación es el siguiente:Uso de boost :: lock_guard para el bloqueo simple de datos compartidos
#include <iostream>
#include <deque>
#include <boost/thread.hpp>
boost::mutex mutex;
std::deque<std::string> queue;
void producer()
{
while (true) {
boost::lock_guard<boost::mutex> lock(mutex);
std::cout << "producer() pushing string onto queue" << std::endl;
queue.push_back(std::string("test"));
}
}
void consumer()
{
while (true) {
boost::lock_guard<boost::mutex> lock(mutex);
if (!queue.empty()) {
std::cout << "consumer() popped string " << queue.front() << " from queue" << std::endl;
queue.pop_front();
}
}
}
int main()
{
boost::thread producer_thread(producer);
boost::thread consumer_thread(consumer);
sleep(5);
producer_thread.detach();
consumer_thread.detach();
return 0;
}
Este código se ejecuta como espero, pero cuando main
salidas, consigo
/usr/include/boost/thread/pthread/mutex.hpp:45:
boost::mutex::~mutex(): Assertion `!pthread_mutex_destroy(&m)' failed.
consumer() popped string test from queue
Aborted
(no estoy seguro si la salida de consumer
es relevante en ese posición, pero lo he dejado en.)
¿Estoy haciendo algo mal en mi uso de Boost?
No estoy tratando de escribir ningún tipo de aplicación en particular. Solo estoy tratando de familiarizarme con la biblioteca Boost.Thread. Las llamadas a 'detach' se realizaron durante una sesión de depuración rápida; el comportamiento es idéntico si los elimino.Inicialmente sospeché que los hilos debían detenerse antes de que el programa saliera, de ahí la llamada 'detach'. – kfb
No salga inmediatamente de la rosca principal y no separe el consumidor y el productor. Espere en el hilo principal hasta que el consumidor y el productor trabajen. Y cuando terminen, únete a ellos. Y luego salir de la principal. –
Eso tiene sentido, y detiene la afirmación, ¡gracias! – kfb