Проблемы с использованием Mysql ++ в многопоточной среде

0

Надеясь, что кто-то сможет мне помочь, поскольку я получаю некоторые "странные" ошибки сегментации. В настоящее время я работаю над демоном C++, который периодически обрабатывает входящие данные из источника ввода, а затем отправляет его обратно в другую систему.

Демон в настоящее время запускает два потока - один поток (основной поток), который считывает входящие данные из очереди сообщений и который вставляет обработанные данные в базу данных MySQL, а второй - тот, который читает из конкретной таблицы и перетаскивает обработанные данные в другую систему.

Я предполагаю, что ошибка связана с MySQL и потоками, потому что у меня нет проблем при запуске одного потока (просто обработка данных или просто отталкивание обработанных данных).

Ошибки SIGSEGV связаны с mysql++ (первый метод mysql++, который вызывается после подключения к БД), например:

(gdb) backtrace
#0  clear (this=0xabd4e8) at /usr/include/c++/4.7/bits/basic_string.h:801
#1  ping (this=0xabcf40) at ./lib/dbdriver.h:465
#2  mysqlpp::Connection::ping (this=<optimized out>) at ./lib/connection.cpp:243

Сбой также всегда запускается из вторичного потока, когда оба потока подключены к базе данных MySQL (отлично работает, когда основной поток запускает искусственный while (true) цикл)

Код подключения:

    mysqlConnection = new mysqlpp::Connection(false);
    mysqlConnection->set_option(new mysqlpp::ReconnectOption(true)); // Reconnect if session times out

    if(!mysqlConnection->connect("fakeDbName", "fakeHostName",
                                 "fakeUserName", "fakePassword))
    {
        printf("Failed to connect..\n");
    }

    if(!mysqlConnection->thread_aware())
    {
        printf("Mysql++ not compiled with threading support\n");
    }
    else
    {
        printf("Mysql++ compiled with threading support\n");
    }

Я следил за рекомендациями из mysql++, настраивая/компилируя "-enable-thread-check" и ссылаясь на "libmysqlclient_r". Я получаю "mysql++, скомпилированный с поддержкой потоков" printf после подключения. Я также создаю отдельный объект соединения для обоих потоков.

Любые мысли, кто-нибудь?

Теги:
mysql++

1 ответ

0

Вы можете поместить семафор вокруг доступа к базе данных, чтобы исключить некоторую проблему безопасности потоков в библиотеке mysql. Но мне любопытно, зачем вам нужны отдельные темы здесь... похоже, что действие отправляющего потока привязано непосредственно к принимающему потоку. Почему вы не можете сделать то же самое в одном потоке?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню