重复的mysql_init导致日志Can't create a new thread (errno 11)

程序在运行时遇到MySQL错误,日志显示'Can't create a new thread (errno 11)',怀疑是由于重复调用mysql_init导致资源耗尽。代码审查发现可能的问题在于mysql_real_connect的重复尝试。解决方案是将初始化部分移出循环,确保只初始化一次。已经进行此修改并观察到正常运行,但还需进一步排查确认。另外,讨论了ulimit设置和mysql_close的正确使用,以排除其他可能原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日志内容形如:E1113 11:08:27.761541 19599 ServiceKV_server.skeleton.cpp:258] MYSQL ERROR: Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug




今天发现程序error.log日志报mysql出错,大概报的是mysql资源已用尽,创建不了新的线程,

查看了下程序代码逻辑如下, 初步定为mysql_real_connet问题,但这个需要使用mysql句柄所以可能与句柄mysql有关,


bool InitStorage() {
                        mysql_init(&mysql);   ///////////////////   1
                        mysql_options(&mysql, MYSQL_SET_CHARSET_NAME,"UTF8");/////////////////////   2
                        char * ret_conn = (char*)mysql_real_connect(&mysql, \                 
                                        FLAGS_mysql_host.c_str(), \                           //////////////////////////////////////////////ServiceKV_server.skeleton.cpp:258
                                        FLAGS_mysql_user.c_str(), \
                                        FLAGS_mysql_pass.c_str(), \
                                        FLAGS_mysql_dbname.c_str(), \
                                        FLAGS_mysql_port, \
                                        FLAGS_mysql_socket.c_str(), \
                                        0);
                        if(NULL == ret_conn){
                                LOG(ERROR) << "MYSQL ERROR: " << mysql_error(&mysql);
                                return false;
                        }   
                        return true;
                }  

由于程序的逻辑中会判断执行sql失败后会在循环中反复申请例如:

while(1){

/*调用InitStoage*/

}

所以初步断定为大量重复申请导致,目前将1,2两处移到其它地方只调用一次目前看运行正常,

如果不是上述原因则需要进一步查看日志来调试更正以上内容,

另外网上看有人说ulimit -a显示的mysql 最大进程数太小,通过本地来看不是这个原因本地查看这个值很大,


另外这个MYSQL* pmysql = mysql_init(NULL)这种方式是否正常呢?

默认的mysql_close与你自调用mysql_close会不会出现double free?





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值