我很想知道使用默认的new操作符分配内存是否是非阻塞操作。
例如:
struct Node {
int a,b;
};
..。
Node foo = new Node();
如果多个线程试图创建一个新的节点,如果其中一个线程在分配过程中被操作系统挂起,是否会阻止其他线程取得进展?
我问这个问题的原因是因为我有一个创建新节点的并发数据结构。然后,我修改了算法以回收节点。在24核机器上,这两种算法的吞吐量性能几乎相同。然而,我随后创建了一个在所有系统内核上运行的干扰程序,以便创建尽可能多的操作系统抢占。与回收节点的算法相比,创建新节点的算法的吞吐量性能降低了5倍。
我很好奇为什么会发生这种情况。
谢谢。
*编辑:告诉我linux的c++内存分配器的代码也会很有帮助。我试着在张贴这个问题之前寻找,但很难找到它。
发布于 2011-01-05 10:55:20
发布于 2011-01-05 10:09:08
这真的和this question差不多。
基本上,malloc
没有被定义为线程安全的,但是实现者可以自由地添加实现以使其线程安全。从你的描述中,听起来你的特定版本是。
可以肯定的是,用欧比万的话说,“使用源头,卢克。”malloc
源码将会出现,它通常很容易阅读。
@Mark,你可以通过以下方式获得标准的GNU libc源代码
$ git clone git://sourceware.org/git/glibc.git
$ cd glibc
$ git checkout --track -b glibc-2_11-branch origin/release/2.11/master
另请参见here。请记住,malloc
位于手册的第3部分--它是一个库函数,因此它不会出现在内核源代码中。但是,您可能需要向下阅读brk
、sbrk
、getrlimit
和setrlimit
等命令,才能了解内核的功能。
还有一个链接:GCC project。
好的,还有一个(我可以随时停下来):here's a page,你可以从它下载源代码。解压该文件,您可以在./malloc/malloc.c
中找到它。
发布于 2011-01-05 10:13:32
这个问题有很多好的回答:In multithreaded C/C++, does malloc/new lock the heap when allocating memory.
人们的共识是存在锁定。因此,较大的分配或需要一些交换的分配可能会阻塞另一个线程中的较小分配,即使如果没有正在进行的较大分配,较小的分配可能会完成。
如果你在pthread支持下编译,那么gcc的新版本是线程安全的,但这并不是你真正想要的。
我知道在windows中你可以创建自己的堆,它可以在你的程序开始时用来设置内存。我不知道有任何linux/unix调用来做类似的事情。
https://stackoverflow.com/questions/4600208
复制相似问题