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