0

「奇妙な」セグメンテーション違反が発生しているため、誰かが私を助けてくれることを願っています。私は現在、入力ソースからの受信データを定期的に処理し、それを別のシステムに送り返す 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が表示されます。また、両方のスレッドに個別の接続オブジェクトを作成しています。

何か考えはありますか?

4

1 に答える 1

0

データベース アクセスにセマフォを配置して、mysql ライブラリのスレッド セーフの問題を除外することができます。しかし、ここで別のスレッドが必要な理由が気になります...送信スレッドのアクションが受信スレッドに直接結び付けられているようです。同じスレッドで両方を実行できないのはなぜですか?

于 2014-01-02T16:10:24.530 に答える