两个读写线程对缓冲区进行操作,线程一部分代码如下
        ::EnterCriticalSection(&m_csRcvDataBuf);
//整理搬移缓冲区
int nCurrOffsetBuffer = m_pBufferCurrPos - m_bytRcvDataBuffer;
TRACE(_T("\n nCurrOffsetBuffer = %d\n"), nCurrOffsetBuffer);
if (nCurrOffsetBuffer > MAXRCVDATASIZE/2) {
memcpy(m_bytRcvDataBuffer, m_pBufferCurrPos, m_sDataSize);
m_pBufferCurrPos = m_bytRcvDataBuffer;
}
        ::LeaveCriticalSection(&m_csRcvDataBuf);
在memcpy(m_bytRcvDataBuffer, m_pBufferCurrPos, m_sDataSize);这句话打断点,发现光标指示的nCurrOffsetBuffer 值和前一句话  TRACE(_T("\n nCurrOffsetBuffer = %d\n"), nCurrOffsetBuffer);TRACE出来的值不一致,这是什么原因,另一个线程也是用 
        ::EnterCriticalSection(&m_csRcvDataBuf);  
       ::LeaveCriticalSection(&m_csRcvDataBuf);
进行临界区保护的

解决方案 »

  1.   


    两个读写线程对缓冲区进行操作,线程一部分代码如下
            ::EnterCriticalSection(&m_csRcvDataBuf);
    //整理搬移缓冲区
            int nCurrOffsetBuffer = m_pBufferCurrPos - m_bytRcvDataBuffer;
           TRACE(_T("\n nCurrOffsetBuffer = %d\n"), nCurrOffsetBuffer);
           if (nCurrOffsetBuffer > MAXRCVDATASIZE/2) {
              memcpy(m_bytRcvDataBuffer, m_pBufferCurrPos, m_sDataSize);
             m_pBufferCurrPos = m_bytRcvDataBuffer;
              }
            ::LeaveCriticalSection(&m_csRcvDataBuf);
             memcpy(m_bytRcvDataBuffer, m_pBufferCurrPos, m_sDataSize);//请注意已经出了临界区了
             TRACE(_T("\n nCurrOffsetBuffer = %d\n"), nCurrOffsetBuffer);//TRACE出来的值不一致,这是什么原因,另一个线程也是用
            ::EnterCriticalSection(&m_csRcvDataBuf); //你这两句话有用吗?
            ::LeaveCriticalSection(&m_csRcvDataBuf);
    //进行临界区保护的 
      

  2.   

    memcpy(m_bytRcvDataBuffer, m_pBufferCurrPos, m_sDataSize);//请注意已经出了临界区了
    ::EnterCriticalSection(&m_csRcvDataBuf); //你这两句话有用吗?
            ::LeaveCriticalSection(&m_csRcvDataBuf);
      

  3.   

    楼上的,我想楼主
    在memcpy(m_bytRcvDataBuffer, m_pBufferCurrPos, m_sDataSize);这句话打断点,发现光标指示的nCurrOffsetBuffer 值和前一句话 TRACE(_T("\n nCurrOffsetBuffer = %d\n"), nCurrOffsetBuffer);TRACE出来的值不一致,这是什么原因,另一个线程也是用 
            ::EnterCriticalSection(&m_csRcvDataBuf);  
          ::LeaveCriticalSection(&m_csRcvDataBuf); 
    进行临界区保护的

    这些话都是说明而已,不是代码楼主的m_csRcvDataBuf初始化过了么?
      

  4.   

    确实很怪,
    nCurrOffsetBuffer 你是在临界区内部的,跟另一个线程没什么关系。
    你是执行了memcpy后还是没执行就改变了?
      

  5.   

    一旦出现这样的现象,通常是程序结构的问题,或者rebuild all