состояние буста. Что я делаю неправильно? - PullRequest
0 голосов
/ 24 сентября 2010
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();
}

запуск выполняется boost :: thread.Выполнение вызывается основным потоком программы для постановки в очередь операции.Однако он вылетает после пробуждения из условного ожидания.

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 24 сентября 2010

Ваш код многопоточности выглядит хорошо.Единственное, что пахнет - это смешивание lock_guard и unique_lock, но это не имеет большого значения.Однако я на 99% уверен, что ваш код падает не там, где вы указали, а в следующей строке - q->execute();.Кажется, что вызывающий метод Database::Execute () передает указатель на объект запроса, который расположен в стеке, или, если он размещен динамически, он удаляет его сразу после завершения функции.Позже, однако, ваш поток повторяет указатель на этот удаленный (освобожденный или разрушенный) объект и пытается выполнить его.Другая возможность состоит в том, что указатель NULL передается в Database::Execute (), что приводит к тому же результату.

0 голосов
/ 24 сентября 2010

1001 * попробовать *

while(true)
{
    boost::unique_lock<boost::mutex> lock(mut);
    while(queries_queue.empty())
        cond.wait(lock);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...