mysql的多线程安全问题
来源:互联网 发布:贵州公需科目大数据 编辑:程序博客网 时间:2024/05/18 10:18
多线程情况下,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 ()
(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;}
0 0
- mysql的多线程安全问题
- mysql的多线程安全问题
- mysql链接多线程安全问题
- 多线程(多线程的安全问题)
- 多线程的安全问题
- STL的多线程安全问题
- STL的多线程安全问题
- STL的多线程安全问题
- 多线程的运行安全问题
- 多线程的安全问题
- 多线程的安全问题
- 多线程的安全问题
- 多线程的安全问题
- 多线程安全问题的解决方法
- Java 多线程的安全问题
- 多线程的安全问题
- STL的多线程安全问题
- 多线程:线程的安全问题
- Lambda FAQ_6.Lambda表达式能够使用在哪些场合?
- Android - 小功能 Drawable和Bitmap转换
- LEE
- 使用GSon根据节点名称读取json数组
- 稳压电源(5) 一般电源的设计
- mysql的多线程安全问题
- SQL语句集锦
- 思科预测:2014IPv6使用量激增,迎来物联网SDN年
- 稳压电源(6) 电源稳定性讨论
- NGUI -- UIPopupList
- Android - 小功能 使用ImageView加载本地SdCard图片和加载网络图片
- 如何“隐藏”运行程序的“命令提示符”界面(C代码)
- Linux伙伴系统(一)--伙伴系统的概述
- 使用 XSLT 显示 XML