我是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