我是Boost庫的新手,並且試圖實現在共享隊列上運行的簡單生產者和消費者線程。我的示例實現是這樣的:使用boost :: lock_guard進行簡單的共享數據鎖定
#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時做錯了什麼?
我不想寫任何特定類型的應用程序 - 我只是試圖熟悉Boost.Thread庫。快速調試會話期間調用'detach';如果我刪除它們,行爲是相同的。我最初懷疑在程序退出之前需要停止線程,因此需要「分離」調用。 – kfb 2010-09-16 12:54:33
不要立即從主線程退出,也不要分離消費者和生產者。在主線程中等待,直到你的消費者和生產者工作。當他們完成時加入他們。然後從main退出。 – 2010-09-16 13:08:43
這是有道理的,並且確實停止斷言,謝謝! – kfb 2010-09-16 13:31:27