+ -
当前位置:首页 → 问答吧 → 再问多线程中的malloc和free

再问多线程中的malloc和free

时间:2011-12-16

来源:互联网

先大体说一下我的程序,每个线程在一个全局链表中创建一个节点,然后遍历链表找到该节点,给节点内的数据赋值,在该节点内再创建一个链表(用到malloc)。然后释放掉节点内的链表(用到free)。最后从全局链表中删除掉该节点。这些函数是在DLL中的。
DLL的VC工程设置中use run-time library选的是Multithreaded.
测试程序的VC工程设置use run-time library也是Multithreaded。
 之前我在网上看,malloc和free是线程安全的,所以我在DLL中用到这两个函数的时候并没有加锁,但是多线程测试的时候就出错了:某个地址不能读,某个地址不能写等内存错误。开始以为是程序的问题,找了好久未果。后来在网上看了一篇文章http://blog.csdn.net/biliky/article/details/5305221。 我把所有的malloc和free函数加了锁(critical_section),再测试就好了。 那我现在就不明白了,这个malloc到底是不是线程安全的,或者我哪里设置的不对吗?上面引用的连接中作者提到他的电脑是4核的,作者说可能每个核都同时动态分配内存了。我的电脑是双核的,这个和线程安全有关系吗?

作者: YU441241991   发布时间: 2011-12-16

未必就是malloc和free出了问题吧?

比如
C/C++ code

char *p_szTest;//全局

thread A:
p_szTest = new char[11];//假如正在分配,还没返回地址给p_szTest,线程A就挂起,线程B执行

thread B:
strcpy(p_szTest, "sssss");


额,写着写着,突然想知道new是否为原子操作。。。

作者: et214721856   发布时间: 2011-12-16

补充说明一下:我的程序是这样的,由某个线程创建的节点,在整个程序执行过程中只能由该线程来访问,当某个线程找到了链表中的节点,获得了他的地址后,那么对该节点的操作就都是在该线程内的了。我的malloc和free并不是针对全局变量操作的,而是这个节点里的变量。而且线程不会访问不是由他创建的节点。

作者: YU441241991   发布时间: 2011-12-16