多线程中使用CStringList出现问题!!
我在程序中将CStringList list;定义为全局变量,多个线程使用,然后在其中一个线程中调用list.AddTail( "dd ")从尾部添加字符串。另外一个线程中使用list.RemoveHead()移除列表头的字符串。程序代码如下
CStringList list;
UINT Thread1(LPVOID lparam)
{
int i=0;
while(i <100000)
{
::EnterCriticalSection(&g_cs1);
g_list.AddTail( "hello ");
::LeaveCriticalSection(&g_cs1);
i++;
}
return 0;
}
UINT Thread2(LPVOID lparam)
{
int i=0;
while(i <100000)
{
::EnterCriticalSection(&g_cs2);
if(!g_list.IsEmpty())
{
CString str=(CString)g_list.RemoveHead();
}
::LeaveCriticalSection(&g_cs2);
i++;
}
return 0;
}
在执行过程有时候会出现错误,Debug Assertion Failed,实在是解决不了,请大家帮帮忙
[解决办法]
::EnterCriticalSection(&g_cs2);
if(!g_list.IsEmpty())
{
CString str=(CString)g_list.RemoveHead();
}
::LeaveCriticalSection(&g_cs2);
改为:
::EnterCriticalSection(&g_cs1);
if(!g_list.IsEmpty())
{
CString str=(CString)g_list.RemoveHead();
}
::LeaveCriticalSection(&g_cs1);
[解决办法]
CStringList list,最好是指针,new 出来,以前也碰到过CStringList的问题,就是这样解决的。
[解决办法]
你在两个线程里用了两把不同的锁,
EnterCriticalSection(&g_cs1);
EnterCriticalSection(&g_cs2);
这两个线程之间的同步就没有实现,应该用同一把锁的!!!!!
[解决办法]
g_cs1,g_cs2你怎么用两个CRITICAL_SECTION结构,根本就没互锁,当然会出错。