「奇妙な」セグメンテーション違反が発生しているため、誰かが私を助けてくれることを願っています。私は現在、入力ソースからの受信データを定期的に処理し、それを別のシステムに送り返す C++ デーモンに取り組んでいます。
デーモンは現在、2 つのスレッドを実行します。1 つのスレッド (メイン スレッド) は、メッセージ キューから受信データを読み取り、処理されたデータを MySQL データベースに挿入します。2 つ目のスレッドは、特定のテーブルから読み取り、処理されたデータを別のシステムにプッシュします。
1 つのスレッド (データ処理のみ、または処理されたデータのプッシュバックのみ) を実行するときに問題がないため、エラーは何らかの形で MySQL とスレッドに関連していると思います。
SIGSEGV エラーはすべて mysql++ 関連です (DB に接続した後に呼び出される最初の 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が表示されます。また、両方のスレッドに個別の接続オブジェクトを作成しています。
何か考えはありますか?