2010-12-24 12 views
24

2つのスレッドが同時にメモリを割り当てようとすると、メモリ割り当てにロックがあるかどうか不思議です。私はOpenMPを使ってマルチスレッド、C++コードを実行しています。マルチスレッドC/C++では、malloc/newはメモリを割り当てるときにヒープをロックします

OS:主にLinuxですが、WindowsとMacについても知りたいです。

+2

2つのスレッドに同じメモリが割り当てられるのではないでしょうか?もしそうなら、あなたは心配する必要はありません。 mallocがスレッドセーフでない場合は、最初にそれを発見することはできません。あなたが疑問に思っているのであれば、mallocはスレッドの安全性を実現します。 – EnabrenTane

+0

私の質問は、並列スレッドで割り当てるときのパフォーマンスに関連していました。 –

答えて

14

スレッド固有のキャッシュの作成(この場合、小さなブロックの割り当てにはロックがかかりません)など、特定の実装が改善される可能性があります。たとえば、Googleのthisです。しかし、一般的に、はい、メモリ割り当てのロックがあります。

+0

TCMallocに関する非常に興味深いリンク、ありがとう! –

7

デフォルトでは、Win APIヒープ機能を使用すると、ヒープがロックされます。

少なくともヒープ作成時にロックを制御できます。異なるコンパイラとCランタイムは、malloc/freeファミリとは異なることを行います。たとえば、SmartHeap APIはある時点でスレッドごとに1つのヒープを作成したため、ロックを必要としませんでした。また、その動作をオンまたはオフにする設定オプションもありました。

Borland WindowsおよびOS/2コンパイラは、90年代初期と中期のある時点で、beginthreadで複数のスレッドが起動されるまで、ヒープロック(早すぎる最適化のバグ)を明示的にオフにしました。多くの多くの人々は、OSのAPI呼び出しでスレッドを生成しようとしましたが、その後、ヒープが地獄に自分自身のすべてを破損したときに驚いた...

6

http://en.wikipedia.org/wiki/Malloc

現代のmallocの実装を保つことによってロックフリーできるだけのようにしてみてくださいスレッドごとに別々の「アリーナ」を作成します。

+4

Wikipediaは[権限のあるソース]ではありません(http://chronicle.com/blogs/wiredcampus/wikipedia-founder-discourages-academic-use-of-his-creation/2305):是非ともこれを出発点として使用してください権威のある情報源を学習して見つけることができます。しかし、それは権威ある情報源ではないので、引用するべきではありません。 –

+14

リンクは、権限があるかどうかにかかわらず、便利です。私たちは学術論文をここに書いていません。 – nobar

5

フリーストアは共有リソースであり、同期する必要があります。割当/割当解除にはコストがかかる。パフォーマンスのためにマルチスレッド化している場合、頻繁な割り当て/割り当て解除がボトルネックになる可能性があります。原則として、きついループ内の割り当て/解放を避けてください。別の問題は、誤った共有です。

関連する問題