定义了一个CList<CString,CString> bList;主线程:
    在TIMER里面处理,不定时向bList插入数据
    CString sqlstr;
    sqlstr.Format("insert into myTable.....");//简单的数据库插入语句
    bList.AddTail(sqlstr);辅助线程:
    用WHILE语句不停的执行以下函数:
    //
void ExeDataLog()
{
    if(!bList.IsEmpty())
    {
        CString sql;
        sql=bList.GetHead();
    if(!ExecuteSQL(sql))
    WriteLog("呼叫记录日志失败!sqlstr="+sql);
        bList.RemoveHead();
    }
}大致的程序思路是这样子的,请问下各位大侠,会不会出现线程冲突的情况??因为在程序运行的过程中发现有出现程序自动关闭的情况发生,不知道是什么原因急求各位大侠指点一下,或提供更好的解决办法更好!
在此先多谢了,分不够可再加
在线急等........

解决方案 »

  1.   

    共用的资源需要同步处理,可以使用临界区、互斥、信号一般用CMutex同步比较简单。
      

  2.   

    对bList的访问应该会出现冲突
      

  3.   

    建军1个全局CCriticalSection对象   
    CCriticalSection   myCriticalSection;   主线程中: 
    myCriticalSection.Lock();   
    //....操作链表
    myCriticalSection.Unlock();   
        
    某一线程中: 
    myCriticalSection.Lock();   
    //.... 操作链表  
    myCriticalSection.Unlock();   
        
    操作系统会将主线程与线程中两段代码序列化 
      

  4.   

    加锁ExeDataLog函数里的while循环,当list为空时,需要sleep
      

  5.   

    线程里 感觉凡事while里面没有Sleep的 就得注意了
      

  6.   

    to laiyiling :全局CCriticalSection对象  加锁后会不会影响主线程对链表的写入??即链表插入失败或出现延迟??
      

  7.   

    myCriticalSection.Lock();     
    //....操作A
    myCriticalSection.Unlock();     
          
    myCriticalSection.Lock();     
    //.... 操作B  
    myCriticalSection.Unlock();   这样的话A和B永远不会同时进行,就是说读链表和插入链表分开的,不会插入失败,但延迟就看读链表的时间了
      

  8.   

    CList本身没有线程同步机制,需要自己处理,使用各种同步对象都可以,当某一线程正在访问时,其它线程如要访问则进入等待状态,不会失败,延迟时间取决于其它线程占有对象的时间,通常可以忽略不计。另外,你可以把CList类再重新封装一下,在类中定义同步对象并重载各个成员函数,这样在使用时就不需要另外处理了,重新封装的类日后也可以用在其它项目中。
      

  9.   


    我觉得这个答案最好,能够完全解决lz的问题。另外我再罗嗦几句:
    1、在多线程的编程中,最需要注意的就是数据访问冲突问题和线程的重入问题。
       楼主所遇到的这个问题,就是典型的数据访问冲突问题。
       必须采用加锁,信号灯等方式,来避免同时读写同一个数据。
       建议lz有时间多看看多线程方面的编程知识。2、数据的冲突,一般应该不至于导致程序的自动关闭。
       怀疑lz的程序还有其他问题,应该再仔细查查。
      

  10.   


    大错特错,Sleep不是提供给线程同步用的。再多的Sleep消除不了线程冲突的隐患,仅仅能大大降低程序的执行速度。