请教高手解决方法。1:问题一:
   经过日志监测,发现了多个线程监测到同一个用户退出,当然,程序用互斥处理,所以真实只删除了一次。各位在开发的时候,有没有什么办法,避免多个线程监测到同一事件,而进行处理的方法?2:问题二:
   给所有客户端广播的过程中,也发现奇怪问题。不知为何引发了GetQueuedCompletionStatus的dwBytesTransfered非0,而收到的Buffer却为空。
   服务器端使用
for(iter = g_ClientContext.begin() ; iter != g_ClientContext.end(); ++iter){
if(b_FoodBroadCast==1){
   if((*iter)->UserType ==1 && (*iter)->IsLogin == true){
       if(p_wbuf->len != 256 && strlen(p_wbuf->buf) != 0){
            nBytesSent = WSASend((*iter)->GetSocket(), p_wbuf, 1,&dwBytes, dwFlags, p_ol, NULL);
       }
   }
}
}
如下代码广播数据,引发了GetQueuedCompletionStatus的dwBytesTransfered非0,而收到的Buffer却为空。
各位有什么好的建议没有,分不够可以加。谢谢

解决方案 »

  1.   

    怎么会多个线程监控同一个事件呢?俺是用一个独立的监控线程
    其他线程需要使用则通过线程消息,线程同步来处理就像需要COM处理的系统一样,一个线程1个COM实例显然是不好的对于2~俺不清楚啦~
    Vista和Win2008支持新的Pooling API更方便的实现线程池
      

  2.   

    问题一,不明白具体是怎么处理的。但是却有可能,当一个连接正拿到连接"上下文(Context)"(连接上下文,即与该连接唯一相关联,并可以用来对连接进行描述的一个连接具体信息组)内存进行收发操作时,由于网络断开,导致另外一个线程在这过程当中释放掉该"上下文"内存,这个时候再次发起收发请求,就会非法操作,即内存溢出。对于这种情况,可以使用引用计数来管理,一个线程需要操作一个连接的时候,先增加引用计数,当增加引用计数失败时,不再继续操作。而由于引用计数的作用,可以防止引用计数不为0时,不进行真正的内存释放,并且不需要理会各线程的操作顺序,线程可以完全独立地操作,只须使用原子操作引用计数和,而不需要特意进行同步。问题二,首先应该消除问题一所导致的内存溢出带来的麻烦。然后再对返回值进行判断,在发现有问题时,及时调用GetLastError进行错误判断。
      

  3.   

    to liuyang:
    感谢回复,的确是应该串行处理,用独立的线程来监视,将事件序列化。
    to 僵哥:
    谢谢
    开发的时候,没有使用计数,看来是的确有必要,或者就用单独的线程来处理,使得处理串行化。或者就用计数的方法。问题二:内存溢出的概率比较小,GetLastError出现的值很奇怪,很多次的都不一样
    昨晚上没有办法,重新写了三个模块,今天好多了,客户那边测试效果好多了希望能够稳定
      

  4.   

    GetLastError的值不确定,这个最先要查的就是内存的问题.