两个读写线程对缓冲区进行操作,线程一部分代码如下
::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);
进行临界区保护的
两个读写线程对缓冲区进行操作,线程一部分代码如下
::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);
//进行临界区保护的
::EnterCriticalSection(&m_csRcvDataBuf); //你这两句话有用吗?
::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);
进行临界区保护的
这些话都是说明而已,不是代码楼主的m_csRcvDataBuf初始化过了么?
nCurrOffsetBuffer 你是在临界区内部的,跟另一个线程没什么关系。
你是执行了memcpy后还是没执行就改变了?