Я пишу многопоточное приложение на C ++, используя потоки Boost (pthread). Приложение порождает 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 () и т. Д.), И ни одна из них не из моего кода, так как мой код не выполняет никаких операций ввода-вывода.
Кто-нибудь может указать, почему возникает эта проблема. Должен ли я проверить свой код / сеть или конфигурацию сервера MySQL? Правильно ли я использовал библиотеку соединителей C ++?
Задача ещё не решена.
Других решений пока нет …