- 论坛徽章:
- 1
|
本帖最后由 jd808 于 2015-05-18 16:40 编辑
- int BaseTEngine::CallConnList(std::tr1::function<int(Conn *,Conn *,const char *)> f,Conn * ActConn,const char *command)
- {
- Conn *pNext= NULL, *pcon= NULL;
- ConnList* m_UserList = g_pServer->GetUserList();
- for (int i=0; i<g_pServer->GetUserListCount(); i++) {
- pthread_rwlock_rdlock(&m_UserList[i].ConnListLock);
- pcon = m_UserList[i].GetHead()->GetNext();
- while (pcon != NULL) {
- pNext = pcon->GetNext();
- if(pcon->is_login==1&& pcon->fd_type==1)
- f(pcon,ActConn,command);
- pcon = pNext;
- }
- pthread_rwlock_unlock(&m_UserList[i].ConnListLock);
- }
- return 0;
- }
复制代码 这是用户线程里的
另外一个主线程- ConnList *plist = conn->GetList();
- pthread_rwlock_wrlock(&plist->ConnListLock);//在用户大规模断开,并且有部分用户在大规模发送消息的时候这里出现死锁
- conn->GetList()->Delete(conn);
- pthread_rwlock_unlock(&plist->ConnListLock);
复制代码 一直找不到原因,Delete里只是删除链表的一个元素而已,f(pcon,ActConn,command);这个函数也是保证绝对安全的,就是调用libevent的发送函数将消息发送出去。
也没发现有死循环的现象,一但死锁,cpu暂用为0,死循环的话应该cpu很高才对。
大虾帮忙看看。 |
|