0

Boost スレッド (pthread) を使用して C++ でマルチスレッド アプリケーションを作成しています。アプリケーションは 100 個のスレッドを生成し、各スレッドは次のタスクを実行します (各スレッドで実行されるコード スニペットを作成しています)。

try {

    driver = get_driver_instance();
    con = driver->connect(SettingsClass.HostName, \
                  SettingsClass.UserName,SettingsClass.Password);

    // SettingsClass is a global static class whose members 
    // (HostName, UserName, Password, etc) are initialized once
    // before *any* thread is created.

    con->setSchema("MyDatabase");

    driver->threadInit();

    string dbQuery = "select A, B, C from XYZTable where D=?";
    prepStmt = con->prepareStatement(dbQuery);
    prepStmt->setInt(1, 1);
    rSet = prepStmt->executeQuery();

    /* Do Something With rSet, the result set */

    delete rSet;
    delete prepStmt;
    if (con != NULL && !con->isClosed()) {
        con -> close();
    driver->threadEnd();
    delete con;
    } 
    catch (SQLException &e) 
    {
        /* Log Exception */                            
    }

プロセス (前述のアプリ、つまり 100 のスレッド) を実行する際に、途中で gdb をアタッチし、スレッドの 40% 以上がread() 呼び出しでハングしていることを確認しました。すべてのバックトレースには mysql ライブラリ関数 (vio_read() など) があり、私のコードは I/O を実行しないため、私のコードからのものはありません。

なぜこの問題が発生するのか、誰でも指摘できますか。コード/ネットワークまたは MySQL サーバーの構成を確認する必要がありますか? C++ コネクタ ライブラリを適切に使用しましたか?

4

0 に答える 0