这二天在做一个东东,功能是这样的。主线程往list写数据,数据元素类型是char*,即声明list变量是这样的:list<char*> g_pList。而其他次线程要做的事是读取这个list中的数据,次线程会利用这些数据做些事情。
好了,让我们来看看代码吧。
main Thread:
void SomeFun(void)
{
.......
EnterCriticalSection(&g_csForList); //通过临界区实现同步(不知这个说法是否正确)
g_pList.push_back(p);
LeaveCriticalSection(&g_csForList);
.......
}
Sub_Thread:
DWORD WINAPI Sub_Thread(pvoid pv)
{
for (list<const TCHAR*>::iterator iter = g_pList.begin();
iter != g_pList.end(); iter ++)
{
// do something
}
}
代码就是这么点。呵呵
接着就是debug了,发现在sub_Thread中,我始终无法获取push进去的数据。但在main thread 这个SomeFunc函数可以获取push到list中的数据,但为什么在Sub_thread无法获取,搞了半天,查了一些资料,最后发现原来是这样的:
在我的主线程的SomeFunc这个函数中,变量p只是一个局部指针变量,对局部指针变量,我们知道出了函数体,它的内容是通常不会是原来写的数据。这样,我们可以解释为什么在SomeFunc这个函数体内,而到我们的Sub_Thread体内无法获取数据了。好了,既然找到了问题,那无法就new来处理这个问题了。当我不知道如何在erase 这些节点时同时释放new出来的内存,请高手指教。
从这里我们也可以看出,语言基础是十分重要的。这个问题在林锐的高质量讲过,但我这个问题应该是变相的返回一个局部指针变量,在这写出来有二点希望各位注意:
1、并不是所有的多线程问题和同步或线程之间的配合有关
2、要把语言基础夯实
欢迎你与我交流,我的QQ:99282122.谢谢!