定义了一个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();
}
}大致的程序思路是这样子的,请问下各位大侠,会不会出现线程冲突的情况??因为在程序运行的过程中发现有出现程序自动关闭的情况发生,不知道是什么原因急求各位大侠指点一下,或提供更好的解决办法更好!
在此先多谢了,分不够可再加
在线急等........
在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();
}
}大致的程序思路是这样子的,请问下各位大侠,会不会出现线程冲突的情况??因为在程序运行的过程中发现有出现程序自动关闭的情况发生,不知道是什么原因急求各位大侠指点一下,或提供更好的解决办法更好!
在此先多谢了,分不够可再加
在线急等........
CCriticalSection myCriticalSection; 主线程中:
myCriticalSection.Lock();
//....操作链表
myCriticalSection.Unlock();
某一线程中:
myCriticalSection.Lock();
//.... 操作链表
myCriticalSection.Unlock();
操作系统会将主线程与线程中两段代码序列化
//....操作A
myCriticalSection.Unlock();
myCriticalSection.Lock();
//.... 操作B
myCriticalSection.Unlock(); 这样的话A和B永远不会同时进行,就是说读链表和插入链表分开的,不会插入失败,但延迟就看读链表的时间了
我觉得这个答案最好,能够完全解决lz的问题。另外我再罗嗦几句:
1、在多线程的编程中,最需要注意的就是数据访问冲突问题和线程的重入问题。
楼主所遇到的这个问题,就是典型的数据访问冲突问题。
必须采用加锁,信号灯等方式,来避免同时读写同一个数据。
建议lz有时间多看看多线程方面的编程知识。2、数据的冲突,一般应该不至于导致程序的自动关闭。
怀疑lz的程序还有其他问题,应该再仔细查查。
大错特错,Sleep不是提供给线程同步用的。再多的Sleep消除不了线程冲突的隐患,仅仅能大大降低程序的执行速度。