构造函数
CCoopCache::CCoopCache(long nCacheSize)
{
m_nCacheSize = nCacheSize;
m_pCache = new ICACHE[m_nCacheSize];
memset(m_pCache,0,sizeof(ICACHE)*m_nCacheSize);
m_nHeadID = m_nEndID = 0;
}
里面初始化了m_nHeadID = m_nEndID = 0;
里面有两个函数
void CCoopCache::SendCache(short SendSize,LPSTR SendBuf)
{
m_SecLock.Lock();
if (m_nHeadID+1 == m_nEndID || m_nEndID == 0 && m_nHeadID+1 == m_nCacheSize) 
{
m_SecLock.Unlock();
return;
}
m_pCache[m_nHeadID].SendSize = SendSize;
memcpy(m_pCache[m_nHeadID].SendBuf,SendBuf,SendSize);
InterlockedExchange(&m_nHeadID,((m_nHeadID+1) >= m_nCacheSize)? 0 : m_nHeadID+1);
m_SecLock.Unlock();
}
BOOL CCoopCache::PeekCache(short &SendSize,LPSTR SendBuf)
{
m_SecLock.Lock();
if (m_nHeadID != m_nEndID)
{
SendSize = m_pCache[m_nEndID].SendSize;
memcpy(SendBuf,m_pCache[m_nEndID].SendBuf,SendSize);
InterlockedExchange(&m_nEndID,((m_nEndID+1) >= m_nCacheSize) ? 0 : m_nEndID+1);
m_SecLock.Unlock();
return(TRUE);
}
m_SecLock.Unlock();
return(FALSE);
}
如果调用SendCache,此时进入if语句,直接return了,如果是调用PeekCache,不会进入if语句,也是直接返回了
都不会调用InterlockedExchange,所以m_nHeadID ,m_nEndID 值会一直不变,别人的程序,是不是m_nEndID 初始化有问题啊,不应该是0;

解决方案 »

  1.   

    环形队列,m_nEndID 初始化没问题
    从代码看,要m_nCacheSize>1才能正常工作
      

  2.   

    m_nCacheSize = nCacheSize;会大于1,那怎么不进入if (m_nHeadID+1 == m_nEndID || m_nEndID == 0 && m_nHeadID+1 == m_nCacheSize) 或是进入的if (m_nHeadID != m_nEndID)不然m_nHeadID,m_nHeadID 一直不会改变
      

  3.   

    第一次调用SendCache时
    if (m_nHeadID+1 == m_nEndID || m_nEndID == 0 && m_nHeadID+1 == m_nCacheSize)
    这个是会进入的,除非m_nCacheSize<=1
    也就是你构造CCoopCache(long nCacheSize)时,nCacheSize大于1
      

  4.   

    说错了,
    第一次调用SendCache时
    if (m_nHeadID+1 == m_nEndID || m_nEndID == 0 && m_nHeadID+1 == m_nCacheSize)
    不会进入
      

  5.   

    饿,Soga,有点懂了,是if(a || b && c)
    我从a看到b发现成立就进了
    谢谢了,运算符都没注意-_-