Здравствуйте, green.nsk, Вы писали:
GN>GN>#include <unistd.h>
GN>#include <pthread.h>
GN>#include <assert.h>
GN>#include <mysql.h>
GN>void* thread(void*)
GN>{
GN> my_bool mbRet = mysql_thread_init();
GN> assert(mbRet == 0); // weird, but as per mysql_thread_init documentation
GN> MYSQL sqlObj;
GN> void* pRet = mysql_init(&sqlObj);
GN> assert(pRet == &sqlObj);
GN> pRet = mysql_real_connect(&sqlObj, "127.0.0.1", "root", "123", "mysql", 3306, "/var/run/mysqld/mysqld.sock", 0);
GN> assert(pRet == &sqlObj); // ломается тут.
GN> mysql_close(&sqlObj);
GN> mysql_thread_end();
GN> return NULL;
GN>}
GN>int main()
GN>{
GN> assert(mysql_thread_safe());
GN> static const size_t nThreads = 10;
GN> pthread_t threads[nThreads];
GN> for (size_t i = 0; i < nThreads; ++i)
GN> {
GN> int iRet = pthread_create(&threads[i], NULL, thread, NULL);
GN> //usleep(10000);
GN> assert(iRet == 0);
GN> }
GN> for (size_t i = 0; i < nThreads; ++i)
GN> {
GN> void* retVal = NULL;
GN> pthread_join(threads[i], &retVal);
GN> assert(retVal == NULL);
GN> }
GN> return 0;
GN>}
GN>// compile: g++ a.cpp -ggdb -lpthread -lmysqlclient_r && gdb ./a.out
GN>
Проблема в многопоточности и инициализации ресурсов по 100500 раз. Сделай инициализацию и закрытие базы за пределами тредов, после этого проверь свой код на race-condiction-ы. Запускать такой код лучше под нагрузкой которую можно сэмулировать с помощью dd.