3个线程同时执行mysql_real_connect的时候,总是会有1-3个线程出错,然后程序崩溃

honemay 2010-11-04 06:19:18
这个问题困扰2个月了,在C语言版块没解决,只好来这里看看有类似情况的兄弟不
由于我的程序时由lighttpd拉起来的,只要connect执行出错,程序必定崩溃.而不由lihgttpd启动的话,就没法跟我的程序通信了,那样的话,怎么搞connect也会成功.
我用过信号量来处理保证只一个进程connect数据,也同样出错,反复修改了2个月,方法用尽,依然没解决,求帮助...
下面是这部分代码

MYSQL* m_insert_mysql = new MYSQL;
mysql_init(m_insert_mysql); //这里如果init失败,也是程序崩溃,所以下面这行NULL判断完全是多余的
if (m_insert_mysql==NULL) return;

//就在下面这行,3个进程同时执行,总有1-2个进程会出错然后程序崩溃m_insert_mysql = mysql_real_connect(m_insert_mysql, "127.0.0.1", "mydb", "mydb^2010","mydb",3306, NULL, 0);
......//下面的代码
mysql_close(m_insert_mysql);

...全文
350 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zuoxingyu 2010-11-05
  • 打赏
  • 举报
回复
你到MYSQL的安装目录下的DATA文件夹下,打开.ERR文件看看。
honemay 2010-11-05
  • 打赏
  • 举报
回复
//11:42:45 这里是正常的
101105 11:42:45 80 Connect lrcdb@localhost on lrcdb
80 Quit
81 Connect lrcdb@localhost on lrcdb
81 Quit

//这里就第2个进程连接的时候就断了,只看到connect 没有Quit了
101105 11:44:45 82 Connect lrcdb@localhost on lrcdb
82 Quit
83 Connect lrcdb@localhost on lrcdb

//上面那个进程死了,所以马上lighttpd又拉起一个进程
101105 11:44:51 84 Connect lrcdb@localhost on
84 Init DB lrcdb
84 Query SET NAMES utf8
85 Connect lrcdb@localhost on
85 Init DB lrcdb
85 Query SET NAMES utf8
85 Query select id, title, artist, lrc from lrcdb order by id
101105 11:44:55 85 Quit
honemay 2010-11-05
  • 打赏
  • 举报
回复
回楼上2位,我的程序是抓不到错误信息的。因为只要connect出错程序就崩溃了
MYSQL错误日志我试试去看,太多信息了
honemay 2010-11-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zuoxingyu 的回复:]
并不是要抓你程序打印的错误,而是MYSQL自己的错误日志。你的程序崩溃后MYSQL服务是否还正常??
[/Quote]
MYSQL正常的。MYSQL自己的错误日志,没有打印信息.
我查MYSQL手册里面说mysql_real_connect,有线程安全问题,我的MYSQL确实不是线程安全的
我现在在试着用信号量,看看能不能让3个进程不在同一个时刻访问MYSQL!
zuoxingyu 2010-11-05
  • 打赏
  • 举报
回复
并不是要抓你程序打印的错误,而是MYSQL自己的错误日志。你的程序崩溃后MYSQL服务是否还正常??
honemay 2010-11-05
  • 打赏
  • 举报
回复
郁闷,我输出了1.err,不过每次程序挂掉,都捕捉不到错误信息
我把代码写的最简单化了,出错后还是抓不到错误信息

Global_wRunlog.writeFile("begin to mysql success!#########");

m_insert_mysql= mysql_real_connect(m_insert_mysql, "127.0.0.1", "lrcdb", "lrcdb^2010","lrcdb",3306, NULL, 0);
mysql_close(m_insert_mysql);
//出错情况下,下面这句就输出不到文件了
Global_wRunlog.writeFile("connect to mysql success!.......");
honemay 2010-11-05
  • 打赏
  • 举报
回复
是我没打开,我现在打开了!!
在测...这个断开模拟起来比较麻烦而且还不每次都断,连上百次都崩溃不了1次!!!
honemay 2010-11-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zuoxingyu 的回复:]
不管你什么操作系统,DATA目录肯定是存在的。
[/Quote]
ubuntu的mysql目录就是在/var/lib/mysql
但是这个目录里都没有找到err文件。
我再看了配置文件,我在找找!
zuoxingyu 2010-11-05
  • 打赏
  • 举报
回复
不管你什么操作系统,DATA目录肯定是存在的。
honemay 2010-11-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zuoxingyu 的回复:]
你到MYSQL的安装目录下的DATA文件夹下,打开.ERR文件看看。
[/Quote]
没有DATA文件夹,也没找到.ERR文件啊.
我的是ubuntu操作系统
zuoxingyu 2010-11-04
  • 打赏
  • 举报
回复
程序崩溃,和MYSQL的关系在哪呢??

看看MYSQL的错误日志,如果是非正常断开,里面会有提示信息的。
ACMAIN_CHM 2010-11-04
  • 打赏
  • 举报
回复
错误信息是什么?
honemay 2010-11-04
  • 打赏
  • 举报
回复

MYSQL* m_insert_mysql = new MYSQL;
mysql_init(m_insert_mysql); //这里如果init失败,也是程序崩溃,所以下面这行NULL判断完全是多余的
if (m_insert_mysql==NULL) return;

就在下面这行,3个进程同时执行,总有1-2个进程会出错然后程序崩溃
m_insert_mysql = mysql_real_connect(m_insert_mysql, "127.0.0.1", "mydb", "mydb^2010","mydb",3306, NULL, 0);
......//下面的代码
mysql_close(m_insert_mysql);


56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧