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 ()スタックに割り当てられたクエリ オブジェクトへのポインタを渡しているか、動的に割り当てられている場合は、関数が完了した直後に削除しているようです。ただし、後で、スレッドはその削除された (解放または破壊された) オブジェクトへのポインターを再試行し、それを実行しようとします。もう 1 つの可能性は、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 に答える