Надеясь, что кто-то сможет мне помочь, поскольку я получаю некоторые "странные" ошибки сегментации. В настоящее время я работаю над демоном 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. Но мне любопытно, зачем вам нужны отдельные темы здесь... похоже, что действие отправляющего потока привязано непосредственно к принимающему потоку. Почему вы не можете сделать то же самое в одном потоке?