【发布时间】:2011-04-16 22:50:34
【问题描述】:
boost::condition_variable cond;
boost::mutex mut;
void Database::run()
{
boost::unique_lock<boost::mutex> lock(mut);
while(true)
{
while(queries_queue.empty())
cond.wait(lock);
mysqlpp::Query* q = queries_queue.front(); // <<< CRASHES HERE <<<
q->execute();
queries_queue.pop_front();
}
}
void Database::Execute(mysqlpp::Query* q)
{
{
boost::lock_guard<boost::mutex> lock(mut);
queries_queue.push_back(q);
}
cond.notify_one();
}
run 由 boost::thread 执行。 Execute 由主程序线程调用以对操作进行排队。 但是,它在从条件等待唤醒后崩溃。
我做错了什么?
【问题讨论】:
-
顺便说一句,你应该给你的条件变量一个更具描述性的名字
-
btw2,在执行函数 q->execute() 时,互斥锁仍然被锁定是故意的吗?
-
我看不出有什么问题。错误可能在其他地方。
-
我不太了解 Boost.Threads,但您在一个函数中使用
lock_guard而在另一个函数中使用unique_lock是否正常? -
@wilx:
lock_guard/unique_lock的选择是合适的。
标签: c++ boost conditional-statements boost-thread