Re: libmysqlclient + threads + gdb = ?
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 14.08.12 11:40
Оценка:
Здравствуйте, 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.
Sic luceat lux!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.