mysql多线程安全吗_mysql的多线程安全问题

多线程情况下,

mysql_init会设置线程的私有数据,如果不注意,则会在mysql_real_connect时出现段错误。

错误如下:

void* func(void* arg)

{

MYSQL* mysql = (MYSQL *)arg;

mysql_real_connect(mysql, “127.0.0.1″, “root”, “123456″, “chen”, 1234, NULL, 0);

mysql_close(mysql);

return (void *)0;

}

int main()

{

MYSQL mysql;

if (NULL == mysql_init(&mysql))

{

return -1;

}

pthread_t thread;

pthread_create(&thread, NULL, func, &mysql);

pthread_join(thread, NULL);

return 0;

}

出现段错误:

#0 0×0000000000417db2 in my_stat () (gdb) bt #0 0×0000000000417db2 in my_stat () #1 0×00000000004169f4 in my_read_charset_file () #2 0×0000000000416cb2 in init_available_charsets () #3 0×00000000004170ea in get_charset_by_csname () #4 0×0000000000405fda in mysql_init_character_set () #5 0×0000000000407024 in mysql_real_connect ()

问题原因

源代码中,Mysql_init()会初始化一些线程私有数据。 Mysql_init()中调用my_thread_init(), 其中设置线程私有数据。

mysql_init()不是完全线程安全的,但是只要成功调用一次就后就线程安全了,如果有多线程并发使用mysql_init(),建议在程序初始化时空调一次mysql_init(),他的这点特性很像qsort() 。

解决办法

所以可以这么使用:

(1)mysql_init()和mysql_real_connect()放在一起:

(2)调用mysql_thread_init()和mysql_thread_end()来初始化和线程相关的数据

如:

void* func(void* arg)

{

MYSQL* mysql = (MYSQL *)arg;

mysql_thread_init();

mysql_real_connect(mysql, “127.0.0.1″, “root”, “123456″, “chen”, 1234, NULL, 0);

mysql_close(mysql);

mysql_thread_end();

return (void *)0;

}

你可能感兴趣的:(mysql多线程安全吗)