free()阻塞其他线程,系统减速

时间:2013-09-24 13:36:14

标签: c++ multithreading macos

我正在研究多线程插件。当我在相当大的内存块(> 10 MB)上执行free()时,使用我的插件的应用程序会暂时减慢太多。 (它是一个音频应用程序,音频线程的时间太少)。 我不确定free()是否使用了大量CPU,或者它是否阻塞了其他线程太长时间。 似乎对madvice()的调用正在做很多工作。我过去常常()占用的时间不多(当我以32位模式运行时不会这样做。)

一些信息: OSX 10.8 64位插件&程序 C ++

非常欢迎任何关于如何继续的建议。

4 个答案:

答案 0 :(得分:2)

一个明显的建议当然是停止执行free()(顺便说一下,这应该是C ++中某种形式的delete

只要您的插件仍然加载并处于活动状态(或者可能正在“运行”),就不要释放内存,在插件不再需要时可以释放资源。

如果您需要在释放旧缓冲区后重新分配新缓冲区,请找出重新使用已分配内存的方法。

答案 1 :(得分:0)

如果您重复使用内存,可能使用展示位置new,那么您可以完全取消对free/delete的调用。

答案 2 :(得分:0)

如果缓冲区大小相同或几乎相同,那么您可以从延迟free中获益,而使用realloc()。这可能比较棘手。

答案 3 :(得分:0)

对于大型分配,我现在使用vm_allocate(),它似乎不会调用冗长的madvice()。

由于我使用vm_allocate()及其对应的vm_deallocate(),所有内存释放调用再次快速。