首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

多线程中使用CStringList出现有关问题!

2012-01-28 
多线程中使用CStringList出现问题!!我在程序中将CStringListlist;定义为全局变量,多个线程使用,然后在其中

多线程中使用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结构,根本就没互锁,当然会出错。

热点排行