【发布时间】:2014-09-10 18:59:35
【问题描述】:
我需要一些建议如何正确发送已连接用户的双向链接列表。到目前为止,关于我的代码和方法的一些基本信息:
我将所有连接用户的信息保存在双向链表中,在线程之间共享。我将列表的头部存储在全局变量中:*PPER_user g_usersList,用户的结构如下:
typedef struct _user {
char id;
char status;
struct _user *pCtxtBack;
struct _user *pCtxtForward;
} user, *PPER_user;
当新用户连接到服务器时,从链表中收集连接用户的数据并发送给他:
WSABUF wsabuf; PPER_player pTemp1, pTemp2; unsigned int c=0;
.....
EnterCriticalSection(&g_CSuserslist);
pTemp1 = g_usersList;
while( pTemp1 ) {
pTemp2 = pTemp1->pCtxtBack;
wsabuf.buf[c++]=pTemp1->id; // fill buffer with data about all users
wsabuf.buf[c++]=pTemp1->status; //
pTemp1 = pTemp2;
};
WSASend(...,wsabuf,...);
LeaveCriticalSection(&g_CSuserslist);
但是关于上面代码的一些事情让我感到困惑:
链表被其他线程大量使用。连接的用户越多(例如 100,1000),锁定数据的整个持续时间的时间列表就越长。我应该接受还是找到更好的方法来做到这一点?
似乎当一个线程锁定列表而 while 循环遍历所有链式结构(用户)收集所有 id、status 时,当用户想要更改自己的 id 时,其他线程应该使用相同的 CriticalSection(&g_CSuserslist),状态等。但这可能会破坏性能。也许我应该改变我的应用程序的所有设计或什么?
如果您有任何见解,我们将不胜感激。提前致谢。
【问题讨论】:
标签: c++ c multithreading critical-section iocp