Использование boost :: lock_guard для простой блокировки общих данных

Я новичок в библиотеке Boost и пытаюсь реализовать простые потоки производителя и потребителя, которые работают с общей очередью. Моя реализация в качестве примера выглядит так:

#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;
}

Этот код работает так, как я ожидал, но когда main завершается, я получаю

/usr/include/boost/thread/pthread/mutex.hpp:45:    
    boost::mutex::~mutex(): Assertion `!pthread_mutex_destroy(&m)' failed.
consumer() popped string test from queue
Aborted

(я не уверен, что вывод от consumer актуально в этой позиции, но я оставил ее. )

Я что-то не так делаю при использовании Boost?

14
задан kfb 16 September 2010 в 12:20
поделиться