0
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 由主程序线程调用以对操作进行排队。但是,它在从条件等待中唤醒后崩溃。

我究竟做错了什么?

4

2 回答 2

2

您的线程代码看起来不错。唯一有气味的是混合lock_guardunique_lock但这没什么大不了的。但是,我有 99% 的把握,你的代码不是在你所说的地方崩溃,而是在下一行 - q->execute();。似乎该Database::Execute ()方法的调用者正在传递一个指向在堆栈上分配的查询对象的指针,或者,如果它是动态分配的,它会在函数完成后立即将其删除。但是,稍后,您的线程会重试指向该已删除(释放或破坏)对象的指针并尝试执行它。另一种可能性是将 NULL 指针传递给Database::Execute ()导致相同结果的 。

于 2010-09-24T19:28:43.213 回答
-1

尝试

while(true)
{
    boost::unique_lock<boost::mutex> lock(mut);
    while(queries_queue.empty())
        cond.wait(lock);
于 2010-09-24T19:22:17.700 回答