2009-07-01 7 views
3

WindowsのC++アプリケーションで、それぞれ512バイトの5百万エントリを含むstd::hash_setを保持しています。別の(多くの)スレッドでhash_setを作成すると、ProcessExplorerに応じて> 1 GBが使用されます。私はリストを解放するときこれを見る。私はそれをメインスレッドで作成する場合、200 MBをuesesします。この現象は、アプリケーションの32ビット版にのみ適用されます。それは、x64バージョンでoocurではありません。私はWin XP x64でデュアルクワッドコアを使用しています。 メモリリークではありません。すべてがclear()で解放されます。なぜ複数のスレッドが自分のメモリを食べるのですか

私の推測:Windows 32.Bitは、多くのスレッド/多数のコアでは構築されていません。

あなたのご意見は?

+3

おそらく、プロセスエクスプローラが間違っていると考えられます。 –

+5

各スレッドには関連するスタックがありますが、何百ものスレッドを回転させない限り、そのメモリをすべて占めることはできません。 Win32はマルチスレッドを適切に実行します。ここに何か他のことが起こっている。 –

+0

@neil:私はまた、vmmapでそれを二重にチェックしました。これらの通行料金のすべてが正確ではないことは分かっていますが、まったく間違っているわけではありません。何よりも:スレッドを使用すると、32Bitアプリケーションのメモリが不足します。 @Kevin:私はピーク時に約20-30スレッドを使用します。それらのほとんどはclear()を呼び出す前に終了しています。 –

答えて

6

データ構造は最終的にヒープから割り当てられ、スレッドに関係なく同じヒープになります。別のスレッドからヒープコールを行うことは、割り当てられるメモリの量に影響を与えません。あなたのツールがあなたに嘘をついているか、hash_setを他のいくつかのスレッドに偶然に割り振っています。

関連する問題