说明:
线程a 接收数据,线程b向外发送数据,两个线程共同使用一个CList< CString, CString& >。
a往clist add 的时候使用 CRITICAL_SECTION 进行保护,b从clist get 的时候也使用 CRITICAL_SECTION 进行保护。现象:
在a接收的数据的频率低的时候没有问题,在屏蔽clist的使用的代码的情况下也不会出现问题。
在频率高的时候。就会少接收部分数据。//出问题的情况表现:
计数显示可以看出问题的现象,在频率高的情况下,计数显示会偶尔停止一次或几次,数据就是在这时丢失的。问题:个人觉得应该是 CRITICAL_SECTION 的数据保护产生的问题。
      1 是CRITICAL_SECTION 的效率不够?有没有效率更高一些的?
      2 还是windows的工作情况就是这样的?
      3 有没有解决这种问题的其它方法呢?

解决方案 »

  1.   

    CRITICAL_SECTION只是代码级的同步,保证一段代码只能它自己执行
    这样当和频率高低没有关系吧
    个人建议还是贴代码,感觉上可能是你的同步错了
      

  2.   

    代码: char csRecvData[ DATA_BUFFER_LEN+1 ];
    char csParseData[ DATA_BUFFER_LEN+1 ];
    CString strTermIP;
    UINT nTermPort;
    BOOL nRecvLen = ReceiveFrom( csRecvData, DATA_BUFFER_LEN, strTermIP, nTermPort, 0 );
    if( nRecvLen == SOCKET_ERROR )
    {
    //处理
    return;
    }
    csParseData[nRecvLen] = '\0';
    char* pParseData = csParseData;
    int nParseLen = DATA_BUFFER_LEN;
    EnterCriticalSection( &g_csWaitSendToPortalMutex );
    g_listWaitSendToPortal.AddTail( CString( pParseData ) );
    LeaveCriticalSection( &g_csWaitSendToPortalMutex ); AddDataRecord( pParseData ); //添加数据到显示窗口
      

  3.   

    AddDataRecord( pParseData ); //添加数据到显示窗口
    这句不保护吗?
      

  4.   

    AddDataRecord( pParseData ); //添加数据到显示窗口 
    这句我觉得不需要保护!因为当时已经不操作CList,只有CList是公共缓冲区,另一个线程如果不会访问csParseData就没问题;
    不过我没看明白,为什么有两个数组,接收用的csRecvData,但是放进CList的却是csParseData,楼主自己把握吧,我看可能是少些代码,对吧!随便提一下
    AddDataRecord( pParseData ); //添加数据到显示窗口
    最好改为
    AddDataRecord( (const char*)csParseData); //添加数据到显示窗口
    这样显示单元就无法改变接收缓冲区的内容了,我觉得用CRITICALSECTION应该没有什么效率问题
      

  5.   

    AddDataRecord( pParseData ); //添加数据到显示窗口 
    最好改为 
    AddDataRecord( (const char*)csParseData); //添加数据到显示窗口 这两个东西除了在编译的时候可能有不同的输出信息外,在运行的时候还有不同的地方?
    "这样显示单元就无法改变接收缓冲区的内容了"这个功能貌似是由函数的定义者而不是是用者实现的吧。