提升条件。我究竟做错了什么?

时间:2010-09-24 19:07:43

标签: c++ boost conditional-statements boost-thread

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以对操作进行排队。  但是,从条件等待中醒来后它会崩溃。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

您的线程代码看起来不错。唯一闻到的是混合lock_guardunique_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);