免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: jd808
打印 上一主题 下一主题

[C] 多线程死锁了,给下gdb日志,帮我分析下 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2016-01-11 15:23 |只看该作者
happy_fish100 发表于 2016-01-11 11:40
lock住之后判断宿主指针是否为空,总感觉这样的用法不科学!(lock之前已经判断过了)

如果其他线程会释 ...
哥,没用过智能指针,现在改起来工程量有点大哟

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2016-01-11 15:30 |只看该作者
happy_fish100 发表于 2016-01-11 11:40
lock住之后判断宿主指针是否为空,总感觉这样的用法不科学!(lock之前已经判断过了)

如果其他线程会释 ...
已经是延迟了1秒钟删除的啦,socket断开的时候,并不会真正删除掉conn数据的,只会把他表示成is_down=1,另外一个线程检查is_down==1时彻底删除数据和释放内存

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
13 [报告]
发表于 2016-01-11 15:56 |只看该作者
回复 12# jd808

如何实现的延时删除呢?
不要告诉我你在锁里延时的。
如果的确是延时时间不够,多延时一会儿呗,比如1分钟!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
14 [报告]
发表于 2016-01-11 18:15 |只看该作者
happy_fish100 发表于 2016-01-11 15:56
回复 12# jd808

如何实现的延时删除呢?

是这样的,程序分成主线程,检测线程,执行线程池,主线程负责socket的接入读取数据,检测线程负责检测句柄是否正常,如果用户下线,主线程能够知道,并触发关闭程序
  1. void TServer::CloseEvent(Conn *conn, short events)
  2. {
  3.         pthread_mutex_lock(&conn->UserCMDLock);
  4.         conn->is_down=1;
  5.         pthread_mutex_unlock(&conn->UserCMDLock);
  6. }
复制代码
这个主线程关闭不关别的,就只是吧句柄状态改为可关闭状态(conn->is_down=1;),检测线程每一秒钟检测句柄列表,是否存在is_down==1的,如果存在,则真正将他关闭,并且清除内存。

  1. void TServer::AutoCloseEvent(Conn *conn)
  2. {
  3.         //通知模块,将这个用户下线
  4.         if(conn==NULL)return;
  5.         //调试
  6.         pthread_mutex_lock(&conn->UserCMDLock);
  7.         if(conn==NULL)return;

  8.         ConnList *plist = conn->GetList();
  9.         pthread_rwlock_wrlock(&plist->ConnListLock);
  10.         if(conn==NULL){
  11.                 pthread_rwlock_unlock(&plist->ConnListLock);
  12.                 return;
  13.         }

  14.         _free_prophase(conn);//清除相关内存
  15.         conn->GetList()->Delete(conn);//从句柄列表中删除此句柄,并且将conn置为NULL
  16.         pthread_rwlock_unlock(&plist->ConnListLock);

  17. }
复制代码

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
15 [报告]
发表于 2016-01-11 18:39 |只看该作者

void TServer::AutoCloseEvent(Conn *conn)中,有个问题请注意下:
只看到了 pthread_mutex_lock(&conn->UserCMDLock); 没有看到对应的unlock。

另外一个关键问题,检测线程每一秒钟检测执行,这个不能保证至少延迟1s释放,可能刚设置完is_down,检测线程就将其释放了。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
16 [报告]
发表于 2016-01-12 09:43 |只看该作者
本帖最后由 zylthinking 于 2016-01-12 09:54 编辑

谁能告诉我这个函数里面有谁在 if(send_conn==NULL)return -1;   通过后,能够将局部变量 send_conn 置为 NULL

int TEngine::Base_Client_Lock(Conn *send_conn,const char* command,int size, int is_zip)
{
        if(send_conn==NULL)return -1;
        pthread_mutex_lock(&send_conn->UserCMDLock);
        if(send_conn==NULL)
                return -1;

        if(send_conn->is_down==1){
                pthread_mutex_unlock(&send_conn->UserCMDLock);
                return -1;
        }

        int mid=proto->MODLUE_ID<0?proto->MODLUE_ID:9999999;
        if (Client_BuildPact(mid,m_sbuff, command,size, is_zip) == -1)
        {
                pthread_mutex_unlock(&send_conn->UserCMDLock);
                return -1;
        }
        socket_send(send_conn, m_sbuff->buff,m_sbuff->data_size);
        pthread_mutex_unlock(&send_conn->UserCMDLock);
        return 0;
}

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
17 [报告]
发表于 2016-01-12 10:32 |只看该作者
happy_fish100 发表于 2016-01-11 18:39
void TServer::AutoCloseEvent(Conn *conn)中,有个问题请注意下:
只看到了 pthread_mutex_lock(&conn- ...
确实是不能保证1秒钟,AutoCloseEvent中的unlock没有是没问题的,因为先锁住句柄,然后删除,此时锁已经没了~~,conn已经是NULL啦,这个时候再用pthread_mutex_unlock(&conn->...就会出现段错误呀。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP