2013-06-26 20 views
1

當使用new或malloc分配內存時,分配器可能必須保護自己免於重新進入。我看到兩種方法可以做到這一點:C/C++分配器在多線程上下文中的性能如何?

  • 一個很大的互斥量。此解決方案很簡單,但性能較差
  • 爲每個線程保留一個內存池。性能很高但池的大小可能難以評估。

我認爲大多數分配器使用第二種方法,但是我找不到這種證明。

你知道哪個分配器使用哪種方法?有關於此的標準嗎?

+0

今天最有能力的分配器使用了兩者的組合。 – Mysticial

回答

0

所有使用intel parallel studio(在windows下)的多線程程序分析總是顯示由於分配而導致的鎖定事件和內核時間。這意味着VS'08編譯器的C++新版本主要使用互斥鎖來保持內存的一致性。

每次它在我開發的軟件中成爲問題時,我嘗試使用RIA習慣用法並刪除動態/共享內存,或者如果內存只能由線程本身使用,則使用TLS分配器。

+0

你叫做RIA習語什麼的? – Jezz

+0

對不起,我犯了一個錯字,我會說RAII(資源獲取是InItialization)。但它是你的情況,「這是一種......」。當你實例化一個對象,或者一個線程分配並初始化你之後使用的所有內存和var。或減少最小動態內存使用量。 – alexbuisson

0

C++ 17開始在線程應用程序來指定分配器的行爲:

+0

在C中,從版本2.16開始,'glibc'爲每個線程提供一個內存池:http://patchwork.sourceware.org/patch/19042/ – Jezz