多线程中使用CStringList出现有关问题!
多线程中使用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结构,根本就没互锁,当然会出错。
我在程序中将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结构,根本就没互锁,当然会出错。