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以对操作进行排队。 但是,从条件等待中醒来后它会崩溃。
我做错了什么?
答案 0 :(得分:2)
您的线程代码看起来不错。唯一闻到的是混合lock_guard
和unique_lock
,但这不是什么大问题。不过,我肯定99%你的代码崩溃的地方不在你说的地方,而是在下一行 - q->execute();
。似乎Database::Execute ()
方法的调用者正在将指针传递给在堆栈上分配的查询对象,或者如果它是动态分配的,它会在函数完成后立即删除它。但是,稍后,您的线程会重试指向已删除(释放或销毁)对象的指针并尝试执行它。另一种可能性是将NULL指针传递给Database::Execute ()
,这会导致相同的结果。
答案 1 :(得分:-1)
试
while(true)
{
boost::unique_lock<boost::mutex> lock(mut);
while(queries_queue.empty())
cond.wait(lock);