2009-07-01 12 views
3

Ich habe eine Windows C++ - Anwendung, die eine std::hash_set enthält, die 5 Millionen Einträge mit je 32 Bytes enthält. Wenn ich das hash_set in einem separaten (von vielen) Threads erzeuge, verwendet es laut ProcessExplorer> 1 GB. Ich sehe das, wenn ich die Liste frei mache. Wenn ich es im Hauptthread erstelle, benötigt es 200 MB. Dieses Phänomen betrifft nur die 32-Bit-Version meiner Anwendung. Es ist nicht oocur mit der x64-Version. Ich benutze einen Dual-Quad-Core mit Win XP x64. Es ist kein Speicherleck. Alles ist frei auf clear().Warum essen mehrere Threads meinen Speicher

Meine Vermutung: Windows 32.Bit ist nicht für viele Threads/viele Kerne konstruiert.

Was sind Ihre Gues?

+3

Nur denkbar, Process Explorer ist falsch. –

+5

Jeder Thread hat einen zugeordneten Stapel, aber dieser Speicher konnte nicht für den gesamten Speicher verwendet werden, es sei denn, Sie drehen viele hundert Threads. Brauchen Sie Code, um eine "Antwort würdig" Vermutung zu machen, aber Win32 definitiv Multithreading ausreichend gut; hier läuft noch etwas anderes. –

+0

@neil: Ich habe das auch mit vmmap überprüft. Ich weiß, dass all diese Mautgebühren nicht genau sind - aber sie liegen nicht völlig falsch. Vor allem: Die 32Bit App hat bei Verwendung von Threads nicht mehr genügend Arbeitsspeicher. @Kevin: Ich verwende etwa 20-30 Threads in Spitzenzeit. Die meisten von ihnen werden vor dem Aufruf von clear() beendet. –

Antwort

6

Die Datenstruktur wird letztlich vom Heap zugewiesen, und es ist unabhängig vom Thread derselbe Heap. Wenn Sie Heap-Aufrufe von einem anderen Thread ausführen, wirkt sich dies nicht auf die Größe des zugewiesenen Speichers aus. Entweder liegen Ihnen Ihre Werkzeuge vor, oder Sie ordnen die hash_set zufällig mehreren anderen Threads zu.

Verwandte Themen