(GNU+Linux)多个线程同时调用malloc()

v8wbuo2f  于 2023-10-16  发布在  Linux
关注(0)|答案(1)|浏览(122)

我在网上读到,大多数现代UNIX系统默认都带有线程安全的malloc()。我知道这仅仅意味着一个线程可以安全地调用malloc(),而另一个线程已经在调用malloc()本身。
我正在使用pthreads进行多线程处理。我有一个12核CPU,每个核心有2个线程。总共24个线程。另外,我使用的是GNU C库中的malloc实现。
我的问题是关于同时做它们而不锁定/等待/阻塞。我在一个回答中读到,当多个线程同时调用malloc()时,它“使用内部锁定机制”。

所以我的问题是

如果8个线程恰好同时调用malloc(),是否会有8个malloc调用并行发生,并且它们不会相互干扰?
或者当一个线程调用malloc()时,其他线程 * 必须等待 * 这个线程的malloc调用完成 * 才能继续他们自己的malloc调用?
(我问这个问题是因为我刚刚对我的一个C程序进行了多线程化,该程序大量使用了malloc()和free(),并且加速与所使用的线程不是线性的,尽管从逻辑上讲它应该是线性的,因为没有线程依赖于任何全局的东西,所以不应该发生争用(无论如何,在软件中)。我的设想很简单:每个线程调用一个函数,在一个线程(没有多线程)上大约需要315秒才能完成,这会对我定义的函数进行数百万次其他调用。由于函数代码是只读的,所以X个线程并行运行这个顶级函数应该没有问题,因为每个线程都用自己的参数调用它,并且没有线程依赖于任何全局或共享的东西。当我使用4个线程时,由于某种原因,时间从315秒增加到710秒,当我使用8个线程时,时间增加到1400秒,即使每个线程所做的工作与没有多线程的线程所做的工作完全相同,并且需要315秒才能完成。所以,到底怎么回事??)

67up9zun

67up9zun1#

如果8个线程恰好同时调用malloc(),是否会有8个malloc调用并行发生,并且它们不会相互干扰?
它取决于malloc()的实现,以及其他一些东西。通用操作系统的现代C标准库通常满足同时多处理的要求。
例如,Glibc's malloc维护了多个要从中分配的内存区域,以避免单个malloc()调用迫使所有其他调用阻塞,直到它完成为止。它自适应地管理这些,但默认情况下是allows up to eight times as many arenas as there are CPUs in the system。当然,这是每个过程。如果你运行在一个基于Glibc的系统上,那么,你的8个malloc调用可能确实都是同时进行的。没有任何干扰是一个非常高的标准,但我认为可以肯定地说,通常会有最小的干扰。
在其他系统上,答案可能会有所不同。特别是,Windows的分配器通常性能不佳,尽管我不知道它在多线程应用程序中的处理效果如何。
然而,如果您的线程做了如此多的动态内存管理,以至于您认为这可能是性能问题的一个来源,那么这可能太多了。即使这不是一个特别的问题,以扩大线程的数量,mallocfree是相对较慢的,所以你应该尽量减少使用它们的性能是重要的。

相关问题