题
我刚刚了解到,在C语言 malloc
功能涉及的问题线争时使用在多线程的应用。
C++不会 operator new
遭受同样的问题?如果是,是什么tecnhique我可以用来避免这听起来就像一个大的惩罚在应用程序的性能吗?
解决方案
那个"问题"的线争真的取决于执行情况。一些实现malloc在共同使用的最初没有设计有多线程的中心。但malloc执行专为多线程的应用不应该遭受竞争,在正常情况。
作为一个例子的一个malloc执行情况设计有多记住,来看看 jemalloc.
其他提示
根据所实现的新的但是通常作为malloc的基础是的。这里几件事你可以做到:
- 使用探查的数量来计算的话
malloc()
(也许brk()
)每秒,确保有一个竞争的问题malloc()
. - 尝试工作与并行存储器(ie。 囤)
- 使用堆每当它是可能的:不呼吁新当你不需要。还记得小的份通常是较缓的友好于指标和数据共享之间的螺纹。
该问题在线争在malloc下来简单,堆必须受到保护通过一个互斥的类似设备的随时更新。如果两条线更新堆同时你将会有一场比赛的条件。同样的问题适用于新的使没有基本理由为什么一个应有较少的竞争。
具有说,有一些技巧,以尽量减少竞争。第一是打破堆达成单独的领域。每个舞台上有自己锁。如果一个线程的尝试分配存储器和一个领域是锁着的,它只是试图来分配掉下来的舞台。
释放将需要访问同一个舞台,这是用于malloc.这也可以是优化通过把指针指向被释放到一个免费的列表。这可以完成原子在接下来的舞台上变得锁的所有指针在自由名单将获得解放的正常。
这些技术有助于防止但不排除竞争,这意味着在一个生产者消费者的螺纹型的,你可以好有消费者通过的指针,回给生产者在那里他们可以重复使用,或者删除,因为适当。
不隶属于 StackOverflow