void WaveInProc(...............)
{
lpRecord->m_lsRecordData.AddTail(data);
g_bListCount++;

}SendVoiceThreadProc(LPVOID lpParam)
{if ( g_nListCount >=2)  //在这里设了标志还是不行。
{
 pSendVoice->m_pRecordData->RemoveHead(); // generates INT 3
 g_nListCount--;
}
}

解决方案 »

  1.   

    你可以封装一下这个CList
     然后在他的添加或者是删除时使用事件等临界区访问控制
     使两个线程互斥访问链表就可以了
      

  2.   

    g_bListCount++;
    两个线程一起操作这个的时候,没有互斥访问的话,会容易出现问题的。
      

  3.   

    线程同时进行读写操作时,需要进行同步的,用Mutex和CriticalSection等来保护
      

  4.   

    利用信号量在操作前将队列锁定,下面是我写的一个类,可作参考:
    // 文件上传的任务列表操作类
    class CUploadFileDeque
    {
    private:
    // 查找这个元素是否存在的仿函数
    class UPLOAD_FILE_STRUCT_Find
    {
    public:
    UPLOAD_FILE_STRUCT_Find(string strRecvAddr, int nRecvPort, string strChannel, string strResolution)
    {
    m_strRecvAddr = strRecvAddr;
    m_nRecvPort = nRecvPort;
    m_strChannel = strChannel;
    } bool operator()(const UPLOAD_FILE_STRUCT& srcPara)
    {
    if ( (m_strRecvAddr == srcPara.strRecvAddr)
    &&  (m_nRecvPort == srcPara.nRecvPort)
    &&  (m_strChannel == srcPara.strChannel) 
    &&  (m_strResolution == srcPara.strResolution) )
    {
    return true;
    }
    else
    {
    return false;
    }
    } private:
    string m_strRecvAddr;
    int m_nRecvPort;
    string m_strChannel;
    string m_strResolution;
    };public:
    CUploadFileDeque(void)
    {
    InitializeCriticalSection(&m_cs);
    } ~CUploadFileDeque(void)
    {
    DeleteCriticalSection(&m_cs);
    } UPLOAD_FILE_DEQUE* Lock()
    {
    EnterCriticalSection(&m_cs);
    if (m_UploadFileDeque.size()) 
    {
    return &m_UploadFileDeque;
    } return NULL;
    } bool UnLock()
    {
    LeaveCriticalSection(&m_cs);
    return true;
    } // 查找列表中是否有2个该通道到某地址的任务,有则删除最后一个并添加新的上传任务
    bool PushBack(const UPLOAD_FILE_STRUCT& para)
    {
    Lock();
    int nFindCount = static_cast<int>( count_if(m_UploadFileDeque.begin(), m_UploadFileDeque.end(), 
    UPLOAD_FILE_STRUCT_Find(para.strRecvAddr, 
    para.nRecvPort, 
    para.strChannel, 
    para.strResolution)) );
    if (2 == nFindCount) // 已有2个任务则取消
    {
    UnLock();
    return false;
    } m_UploadFileDeque.push_back(para);
    UnLock(); return true;
    } // 取出一个任务交给上传线程
    UPLOAD_FILE_STRUCT PopFront()
    {
    Lock();
    UPLOAD_FILE_STRUCT UploadFile;
    if (m_UploadFileDeque.size()) 
    {
    UploadFile = *(m_UploadFileDeque.begin());
    m_UploadFileDeque.pop_front();
    }
    UnLock();
    return UploadFile;
    } // 判断列表是否为空
    bool IsEmpty()
    {
    return m_UploadFileDeque.empty();
    } // 清空列表
    bool clear()
    {
    m_UploadFileDeque.clear();
    return true;
    } // 调试时函数:返回列表大小
    int GetSize()
    {
    return (int)(m_UploadFileDeque.size());
    }private:
    UPLOAD_FILE_DEQUE m_UploadFileDeque;
    CRITICAL_SECTION m_cs;};