<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Multithreading, Speicher ans OS retournieren.]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich suche verlorene Bytes, und beim Debuggen bin ich auf ein eigenartiges<br />
Verhalten beim Multithreading unter Linux gestoßen. Hier ist ein<br />
Minimalbeispiel dazu:</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;iostream&gt;
#include &lt;boost/thread.hpp&gt;

using namespace std;

void fun()
{
	cout&lt;&lt;&quot;Hi, I'm the thread&quot;&lt;&lt;endl;
};

int main(int ,char**)
{
#if 0 
	fun();
#else
	boost::thread *a=new boost::thread(fun);
	a-&gt;join();
	delete a;
#endif

	cout&lt;&lt;&quot;Thread finished&quot;&lt;&lt;endl;
	while(1);	
	return 0;
}
</code></pre>
<p>Je nachdem, ob im Code oben #if 0 oder #if 1 steht, wird fun() normal oder<br />
in einem Thread gestartet. Der Thread wird anschließend gelöscht. In jedem<br />
Fall gehe ich danach in eine Endlosschleife, um mit &quot;top&quot; den Speicherbedarf<br />
auslesen zu können.</p>
<p>Ohne Thread: 12 MB<br />
Mit Thread: 24.5 MB</p>
<pre><code>PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                           
23839 geom      20   0 24520 1204 1008 R   99  0.0   7:09.44 justATest
</code></pre>
<p>Was hat es da? Ist das ein Boost-Fehler oder holt sich das OS den Speicher<br />
einfach nicht gleich zurück? Hier sind es nur ein paar Bytes, aber in meiner<br />
Applikation sind es 150 MB, die auf die Art liegen bleiben.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302522/multithreading-speicher-ans-os-retournieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 07:43:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302522.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 20 Apr 2012 14:02:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 14:02:18 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich suche verlorene Bytes, und beim Debuggen bin ich auf ein eigenartiges<br />
Verhalten beim Multithreading unter Linux gestoßen. Hier ist ein<br />
Minimalbeispiel dazu:</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;iostream&gt;
#include &lt;boost/thread.hpp&gt;

using namespace std;

void fun()
{
	cout&lt;&lt;&quot;Hi, I'm the thread&quot;&lt;&lt;endl;
};

int main(int ,char**)
{
#if 0 
	fun();
#else
	boost::thread *a=new boost::thread(fun);
	a-&gt;join();
	delete a;
#endif

	cout&lt;&lt;&quot;Thread finished&quot;&lt;&lt;endl;
	while(1);	
	return 0;
}
</code></pre>
<p>Je nachdem, ob im Code oben #if 0 oder #if 1 steht, wird fun() normal oder<br />
in einem Thread gestartet. Der Thread wird anschließend gelöscht. In jedem<br />
Fall gehe ich danach in eine Endlosschleife, um mit &quot;top&quot; den Speicherbedarf<br />
auslesen zu können.</p>
<p>Ohne Thread: 12 MB<br />
Mit Thread: 24.5 MB</p>
<pre><code>PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                           
23839 geom      20   0 24520 1204 1008 R   99  0.0   7:09.44 justATest
</code></pre>
<p>Was hat es da? Ist das ein Boost-Fehler oder holt sich das OS den Speicher<br />
einfach nicht gleich zurück? Hier sind es nur ein paar Bytes, aber in meiner<br />
Applikation sind es 150 MB, die auf die Art liegen bleiben.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203992</guid><dc:creator><![CDATA[memr]]></dc:creator><pubDate>Fri, 20 Apr 2012 14:02:18 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 14:42:44 GMT]]></title><description><![CDATA[<p>Nur weil der Speicher nicht sofort ans Betriebssystem zurückgegeben wird, heisst das nicht, dass er nicht korrekt freigegeben wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204012</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 20 Apr 2012 14:42:44 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 14:45:30 GMT]]></title><description><![CDATA[<p>Ev. ist ja dein Bsp. einfach ein wenig unglücklich gewählt, denn boost::thread ist movable! D.h. das new ist in aller Regel unnötig!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204013</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 20 Apr 2012 14:45:30 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 14:48:59 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Ev. ist ja dein Bsp. einfach ein wenig unglücklich gewählt, denn boost::thread ist movable! D.h. das new ist in aller Regel unnötig!</p>
</blockquote>
<p>Bei dem Programm muss man aber gar nicht mooven. Da es würde auch reichen, direkt einen Funktor in den Ctor zu geben. Ich denke aber eher, dass der TO die Lebensdauer des Threadobjekts kontrollieren will. Aber da hätte es evtl. auch ein umschließender Scope getan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204016</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 20 Apr 2012 14:48:59 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 14:52:40 GMT]]></title><description><![CDATA[<p>1. Vlt zieht das Threading einen Rattenschwanz an Abhängigkeiten in das Projekt und bläht den Speicherverbrauch auf.<br />
2. Möglicherweise musste auch einfach nur der Heap wachsen und macht das in großen Schritten, um seltener wachsen zu müssen.</p>
<p>Mach mal Folgendes: Geh in die Endlosschleife, besorg dir die PID deines Prozesses und mach 'cat /proc/DIE PID/maps'. Bei beiden. Das kannst du hier posten oder selbst interpretieren. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204022</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 20 Apr 2012 14:52:40 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 14:53:37 GMT]]></title><description><![CDATA[<p>Führ halt nen Scope ein, damit das thread-Objekt auch vor der Schleife aufgeräumt wird...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204023</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 20 Apr 2012 14:53:37 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 14:58:34 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Führ halt nen Scope ein, damit das thread-Objekt auch vor der Schleife aufgeräumt wird...</p>
</blockquote>
<p>Das sagte ich doch schon... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204025</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 20 Apr 2012 14:58:34 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 15:16:20 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>1. Vlt zieht das Threading einen Rattenschwanz an Abhängigkeiten in das Projekt und bläht den Speicherverbrauch auf.<br />
2. Möglicherweise musste auch einfach nur der Heap wachsen und macht das in großen Schritten, um seltener wachsen zu müssen.</p>
<p>Mach mal Folgendes: Geh in die Endlosschleife, besorg dir die PID deines Prozesses und mach 'cat /proc/DIE PID/maps'. Bei beiden. Das kannst du hier posten oder selbst interpretieren. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<pre><code>Multithreaded:
cat /proc/25105/maps
00400000-00406000 r-xp 00000000 08:23 5767236                            /home/geom/repo/dev/test_all/test_mt2/justATest
00605000-00606000 r--p 00005000 08:23 5767236                            /home/geom/repo/dev/test_all/test_mt2/justATest
00606000-00607000 rw-p 00006000 08:23 5767236                            /home/geom/repo/dev/test_all/test_mt2/justATest
025e6000-02607000 rw-p 00000000 00:00 0                                  [heap]
7f3b129b4000-7f3b129b5000 ---p 00000000 00:00 0 
7f3b129b5000-7f3b131b5000 rw-p 00000000 00:00 0 
7f3b131b5000-7f3b13238000 r-xp 00000000 08:21 406195                     /lib/x86_64-linux-gnu/libm-2.13.so
7f3b13238000-7f3b13437000 ---p 00083000 08:21 406195                     /lib/x86_64-linux-gnu/libm-2.13.so
7f3b13437000-7f3b13438000 r--p 00082000 08:21 406195                     /lib/x86_64-linux-gnu/libm-2.13.so
7f3b13438000-7f3b13439000 rw-p 00083000 08:21 406195                     /lib/x86_64-linux-gnu/libm-2.13.so
7f3b13439000-7f3b135d0000 r-xp 00000000 08:21 406191                     /lib/x86_64-linux-gnu/libc-2.13.so
7f3b135d0000-7f3b137cf000 ---p 00197000 08:21 406191                     /lib/x86_64-linux-gnu/libc-2.13.so
7f3b137cf000-7f3b137d3000 r--p 00196000 08:21 406191                     /lib/x86_64-linux-gnu/libc-2.13.so
7f3b137d3000-7f3b137d4000 rw-p 0019a000 08:21 406191                     /lib/x86_64-linux-gnu/libc-2.13.so
7f3b137d4000-7f3b137da000 rw-p 00000000 00:00 0 
7f3b137da000-7f3b137ef000 r-xp 00000000 08:21 395815                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f3b137ef000-7f3b139ee000 ---p 00015000 08:21 395815                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f3b139ee000-7f3b139ef000 r--p 00014000 08:21 395815                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f3b139ef000-7f3b139f0000 rw-p 00015000 08:21 395815                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f3b139f0000-7f3b13ad8000 r-xp 00000000 08:21 924268                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f3b13ad8000-7f3b13cd8000 ---p 000e8000 08:21 924268                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f3b13cd8000-7f3b13ce0000 r--p 000e8000 08:21 924268                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f3b13ce0000-7f3b13ce2000 rw-p 000f0000 08:21 924268                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f3b13ce2000-7f3b13cf7000 rw-p 00000000 00:00 0 
7f3b13cf7000-7f3b13d0f000 r-xp 00000000 08:21 406205                     /lib/x86_64-linux-gnu/libpthread-2.13.so
7f3b13d0f000-7f3b13f0e000 ---p 00018000 08:21 406205                     /lib/x86_64-linux-gnu/libpthread-2.13.so
7f3b13f0e000-7f3b13f0f000 r--p 00017000 08:21 406205                     /lib/x86_64-linux-gnu/libpthread-2.13.so
7f3b13f0f000-7f3b13f10000 rw-p 00018000 08:21 406205                     /lib/x86_64-linux-gnu/libpthread-2.13.so
7f3b13f10000-7f3b13f14000 rw-p 00000000 00:00 0 
7f3b13f14000-7f3b13f2b000 r-xp 00000000 08:21 941896                     /usr/lib/libboost_thread.so.1.46.1
7f3b13f2b000-7f3b1412a000 ---p 00017000 08:21 941896                     /usr/lib/libboost_thread.so.1.46.1
7f3b1412a000-7f3b1412c000 r--p 00016000 08:21 941896                     /usr/lib/libboost_thread.so.1.46.1
7f3b1412c000-7f3b1412d000 rw-p 00018000 08:21 941896                     /usr/lib/libboost_thread.so.1.46.1
7f3b1412d000-7f3b1414e000 r-xp 00000000 08:21 406188                     /lib/x86_64-linux-gnu/ld-2.13.so
7f3b1431c000-7f3b14322000 rw-p 00000000 00:00 0 
7f3b1434a000-7f3b1434d000 rw-p 00000000 00:00 0 
7f3b1434d000-7f3b1434e000 r--p 00020000 08:21 406188                     /lib/x86_64-linux-gnu/ld-2.13.so
7f3b1434e000-7f3b14350000 rw-p 00021000 08:21 406188                     /lib/x86_64-linux-gnu/ld-2.13.so
7fff08a3a000-7fff08a5b000 rw-p 00000000 00:00 0                          [stack]
7fff08bff000-7fff08c00000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
</code></pre>
<pre><code>Ohne Multithreading:
00400000-00403000 r-xp 00000000 08:23 5767236                            /home/geom/repo/dev/test_all/test_mt2/justATest
00602000-00603000 r--p 00002000 08:23 5767236                            /home/geom/repo/dev/test_all/test_mt2/justATest
00603000-00604000 rw-p 00003000 08:23 5767236                            /home/geom/repo/dev/test_all/test_mt2/justATest
01cce000-01cef000 rw-p 00000000 00:00 0                                  [heap]
7f3385dae000-7f3385e31000 r-xp 00000000 08:21 406195                     /lib/x86_64-linux-gnu/libm-2.13.so
7f3385e31000-7f3386030000 ---p 00083000 08:21 406195                     /lib/x86_64-linux-gnu/libm-2.13.so
7f3386030000-7f3386031000 r--p 00082000 08:21 406195                     /lib/x86_64-linux-gnu/libm-2.13.so
7f3386031000-7f3386032000 rw-p 00083000 08:21 406195                     /lib/x86_64-linux-gnu/libm-2.13.so
7f3386032000-7f33861c9000 r-xp 00000000 08:21 406191                     /lib/x86_64-linux-gnu/libc-2.13.so
7f33861c9000-7f33863c8000 ---p 00197000 08:21 406191                     /lib/x86_64-linux-gnu/libc-2.13.so
7f33863c8000-7f33863cc000 r--p 00196000 08:21 406191                     /lib/x86_64-linux-gnu/libc-2.13.so
7f33863cc000-7f33863cd000 rw-p 0019a000 08:21 406191                     /lib/x86_64-linux-gnu/libc-2.13.so
7f33863cd000-7f33863d3000 rw-p 00000000 00:00 0 
7f33863d3000-7f33863e8000 r-xp 00000000 08:21 395815                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f33863e8000-7f33865e7000 ---p 00015000 08:21 395815                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f33865e7000-7f33865e8000 r--p 00014000 08:21 395815                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f33865e8000-7f33865e9000 rw-p 00015000 08:21 395815                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f33865e9000-7f33866d1000 r-xp 00000000 08:21 924268                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f33866d1000-7f33868d1000 ---p 000e8000 08:21 924268                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f33868d1000-7f33868d9000 r--p 000e8000 08:21 924268                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f33868d9000-7f33868db000 rw-p 000f0000 08:21 924268                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f33868db000-7f33868f0000 rw-p 00000000 00:00 0 
7f33868f0000-7f3386911000 r-xp 00000000 08:21 406188                     /lib/x86_64-linux-gnu/ld-2.13.so
7f3386ae0000-7f3386ae5000 rw-p 00000000 00:00 0 
7f3386b0d000-7f3386b10000 rw-p 00000000 00:00 0 
7f3386b10000-7f3386b11000 r--p 00020000 08:21 406188                     /lib/x86_64-linux-gnu/ld-2.13.so
7f3386b11000-7f3386b13000 rw-p 00021000 08:21 406188                     /lib/x86_64-linux-gnu/ld-2.13.so
7fff981ac000-7fff981cd000 rw-p 00000000 00:00 0                          [stack]
7fff981ff000-7fff98200000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2204032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204032</guid><dc:creator><![CDATA[memr]]></dc:creator><pubDate>Fri, 20 Apr 2012 15:16:20 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 15:19:14 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Führ halt nen Scope ein, damit das thread-Objekt auch vor der Schleife aufgeräumt wird...</p>
</blockquote>
<p>Das sagte ich doch schon... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>OK, gleicher Effekt.</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;iostream&gt;
#include &lt;boost/thread.hpp&gt;

using namespace std;

void fun()
{
        cout&lt;&lt;&quot;Hi, I'm the thread&quot;&lt;&lt;endl;
};

int main(int ,char**)
{
#if 0 
        fun();
#else
        {
        boost::thread a(fun);
        a.join();
        }
#endif

        cout&lt;&lt;&quot;Thread finished&quot;&lt;&lt;endl;
        while(1);
        return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2204033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204033</guid><dc:creator><![CDATA[memr]]></dc:creator><pubDate>Fri, 20 Apr 2012 15:19:14 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 15:19:44 GMT]]></title><description><![CDATA[<p>Die zusätzlichen 12.5 MB gehen sicher nicht im Thread-Objekt drauf, d.h. ob new() oder nicht wird hier keine Rolle spielen.</p>
<p>Ich würde eher davon ausgehen dass die Heap-Implementierung den frei gewordenen Speicher nicht ans OS zurückgibt. Entweder weil sie es nicht kann (z.B. wegen Fragmentierung), oder weil sie den Speicher nur dann ans OS zurückgibt, wenn eine bestimmte Grenze überschritten wird. Was für die meisten Applikationen ja auch Sinn macht. Die Heap-Performance würde arg leiden, wenn jede 4K Seite sofort ans OS zurückgegeben würde - dann müsste ja dauernd neuer Speicher angefordert und wieder freigegeben werden.</p>
<p>Ob es ein echtes Memory-Leak gibt, kann man am einfachsten feststellen, indem man ein geeignetes Tool verwendet. Ich denke Valgrind sollte das können (hab's aber selbst noch nie verwendet, da ich für Windows programmiere und wir BoundsChecker dafür verwenden).</p>
<p>Nochwas: es ist denkbar, dass eine CRT/SCL Implementierung bestimmte Datenstrukturen die für thread-safety nötig sind erst erzeugt/initialisiert, wenn der erste &quot;nicht-main&quot; Thread bestimmte Funktionen aufruft. Und in Boost.Thread gibt es definitiv einige Datenstrukturen die &quot;lazy&quot; Initialisiert werden, d.h. erst bei Erzeugung des ersten Boost.Thread.</p>
<p>Ich denke folgendes Testprogramm wäre eher sinnvoll:</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;iostream&gt;
#include &lt;boost/thread.hpp&gt;

using namespace std;

void fun()
{
    cout&lt;&lt;&quot;Hi, I'm the thread&quot;&lt;&lt;endl;
};

int main(int ,char**)
{
    cout&lt;&lt;&quot;Hi, I'm main()&quot;&lt;&lt;endl;

    {
        boost::thread a(fun);
        a.join();
    }

#if 0
    fun();
#else
    {
        boost::thread b(fun);
        b.join();
    }
#endif

    cout&lt;&lt;&quot;Thread finished&quot;&lt;&lt;endl;
    while(1);    
    return 0;
}
</code></pre>
<p>Hier dürfte mMn. kein grosser Unterschied mehr bestehen. Wenn doch, dann könnte man wirklich mal auf die Suche gehen ob hier nicht irgendwas verkehrt läuft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204034</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 20 Apr 2012 15:19:44 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 15:24:31 GMT]]></title><description><![CDATA[<blockquote>
<p>um mit &quot;top&quot; den Speicherbedarf</p>
</blockquote>
<p>Nutze <code>valgrind</code> , <code>top</code> bitte nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204039</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 20 Apr 2012 15:24:31 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 15:52:59 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Die zusätzlichen 12.5 MB gehen sicher nicht im Thread-Objekt drauf, d.h. ob new() oder nicht wird hier keine Rolle spielen.</p>
<p>Ich würde eher davon ausgehen dass die Heap-Implementierung den frei gewordenen Speicher nicht ans OS zurückgibt.</p>
</blockquote>
<p>Ich glaube auch, daß der Speicher aus Effizienzgründen nicht gleich retourniert<br />
wird. Macht nur das Debuggen schwieriger. Valgrind kenne und verwende ich sehr<br />
gerne. Nur ist meine Anwendung numerisch kritisch, und da nicht alle Rundungs-<br />
Modi in Valgrind implementiert sind, läuft das nicht. Unser Testprogramm geht<br />
aber. Endlosschleife entfernt, und dann:</p>
<pre><code>==25904== Memcheck, a memory error detector
==25904== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==25904== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info
==25904== Command: ./justATest
==25904== 
Hi, I'm main()
Hi, I'm the thread
Hi, I'm the thread
Thread finished
==25904== 
==25904== HEAP SUMMARY:
==25904==     in use at exit: 8 bytes in 1 blocks
==25904==   total heap usage: 7 allocs, 6 frees, 808 bytes allocated
==25904== 
==25904== 8 bytes in 1 blocks are still reachable in loss record 1 of 1
==25904==    at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
==25904==    by 0x4E424C9: boost::detail::get_once_per_thread_epoch() (in /usr/lib/libboost_thread.so.1.46.1)
==25904==    by 0x4E3B3BF: ??? (in /usr/lib/libboost_thread.so.1.46.1)
==25904==    by 0x4E3B688: boost::detail::get_current_thread_data() (in /usr/lib/libboost_thread.so.1.46.1)
==25904==    by 0x4E3CDFA: boost::thread::join() (in /usr/lib/libboost_thread.so.1.46.1)
==25904==    by 0x402D4E: main (in /home/geom/repo/dev/test_all/test_mt3/justATest)
==25904== 
==25904== LEAK SUMMARY:
==25904==    definitely lost: 0 bytes in 0 blocks
==25904==    indirectly lost: 0 bytes in 0 blocks
==25904==      possibly lost: 0 bytes in 0 blocks
==25904==    still reachable: 8 bytes in 1 blocks
==25904==         suppressed: 0 bytes in 0 blocks
==25904== 
==25904== For counts of detected and suppressed errors, rerun with: -v
==25904== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)
</code></pre>
<p>Interessant ist, woher die Still-Reachable kommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204053</guid><dc:creator><![CDATA[memr]]></dc:creator><pubDate>Fri, 20 Apr 2012 15:52:59 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 16:14:41 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich glaube auch, daß der Speicher aus Effizienzgründen nicht gleich retourniert wird.</p>
</blockquote>
<p>Ja, weil wenn es gleich danach wieder was vom Programm angefordert wird, fuehlt sich das Betriebssystem verarscht.</p>
<blockquote>
<p>Nur ist meine Anwendung numerisch kritisch, und da nicht alle Rundungs-<br />
Modi in Valgrind implementiert sind, läuft das nicht.</p>
</blockquote>
<p>Naja, Speicher hat normalerweise nichts mit Rundungen zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204060</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 20 Apr 2012 16:14:41 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 17:07:19 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Naja, Speicher hat normalerweise nichts mit Rundungen zu tun.</p>
</blockquote>
<p>Bei Rundungsfehlern werden Prädikate falsch evauliert und das Programm haut<br />
es in Valgrind auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204069</guid><dc:creator><![CDATA[memr]]></dc:creator><pubDate>Fri, 20 Apr 2012 17:07:19 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 17:35:07 GMT]]></title><description><![CDATA[<p><a href="http://stackoverflow.com/questions/6321602/boost-thread-leakage-c" rel="nofollow">http://stackoverflow.com/questions/6321602/boost-thread-leakage-c</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204081</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Fri, 20 Apr 2012 17:35:07 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 17:39:14 GMT]]></title><description><![CDATA[<p>memr schrieb:</p>
<blockquote>
<p>Bei Rundungsfehlern werden Prädikate falsch evauliert</p>
</blockquote>
<p>Valgrind fuehrt dein Programm so aus, wie du es kompiliert hast. Klar kann das Verhalten von Debug zu Release unterschiedlich sein, aber das hat mit Valgrind nichts zu tun. Du kannst Valgrind auch mit der Releaseversion benutzen. Du erhaelts immer noch eine Zusammenfassung.</p>
<blockquote>
<p>und das Programm haut es in Valgrind auf.</p>
</blockquote>
<p>Aeh, und das heisst? Bitte auf Deutsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204084</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 20 Apr 2012 17:39:14 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 18:01:37 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>memr schrieb:</p>
<blockquote>
<p>Bei Rundungsfehlern werden Prädikate falsch evauliert</p>
</blockquote>
<p>Valgrind fuehrt dein Programm so aus, wie du es kompiliert hast. Klar kann das Verhalten von Debug zu Release unterschiedlich sein, aber das hat mit Valgrind nichts zu tun. Du kannst Valgrind auch mit der Releaseversion benutzen. Du erhaelts immer noch eine Zusammenfassung.</p>
<blockquote>
<p>und das Programm haut es in Valgrind auf.</p>
</blockquote>
<p>Aeh, und das heisst? Bitte auf Deutsch.</p>
</blockquote>
<p>In der rechnerischen Geometrie ist es häufig erforderlich, die Vorzeichen von<br />
Determinanten zu ermitteln. Beispielsweise, um festzustellen, ob ein Punkt<br />
oberhalb, unterhalb oder genau in einer Ebene liegt. Ist die Determinante nahe<br />
Null, so kann wegen der begrenzten Rechengenauigkeit eine falsche Antwort<br />
berechnet werden, was den Algorithmus in einen falschen Zweig führt -&gt;<br />
Endlosschleife/Segfault/Assertion. Typischerweise sind viele tausend solcher<br />
Tests erforderlich, so daß das Problem nicht nur theoretischer Natur ist,<br />
sondern eigentlich immer schlagend wird. Es gibt Methoden, um die Problematik<br />
zu handhaben, aber die setzen korrekte Rundung voraus, die in Valgrind nicht<br />
vorliegt. Deshalb laufen dort solche Programme meist nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204088</guid><dc:creator><![CDATA[memr]]></dc:creator><pubDate>Fri, 20 Apr 2012 18:01:37 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 18:24:45 GMT]]></title><description><![CDATA[<p>Ich weiss um die Numerik dahinter Bescheid, nur kann ich den Zusammenhang mit Valgrind nicht herstellen. Valgrind installiert Hooks fuer free und malloc und fuehrt dein Programm aus und tracked deinen Speicher. Dabei kann ich keinen Einfluss auf numerische Berechnungen feststellen. Wo rundet Valgrind?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204091</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 20 Apr 2012 18:24:45 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 18:30:31 GMT]]></title><description><![CDATA[<p><a href="http://stackoverflow.com/questions/1656227/how-does-valgrind-work" rel="nofollow">http://stackoverflow.com/questions/1656227/how-does-valgrind-work</a> schrieb:</p>
<blockquote>
<p>Your program is then run on a synthetic CPU provided by the Valgrind core. As new code is executed for the first time, the core hands the code to the selected tool. The tool adds its own instrumentation code to this and hands the result back to the core, which coordinates the continued execution of this instrumented code.</p>
</blockquote>
<p>Das klingt nicht so, als würde valgrind nur einige Hooks einfügen. Deswegen ist valgrind auch so langsam.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204093</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Fri, 20 Apr 2012 18:30:31 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 18:38:50 GMT]]></title><description><![CDATA[<p>Gut, ich habe wieder was gelernt. Und liest man weiter, dann kann auch Nulgrind benutzt werden. Sicher gibt es zwischen &quot;simulate every instruction&quot; und &quot;nothing&quot; viele Optionen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204095</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 20 Apr 2012 18:38:50 GMT</pubDate></item><item><title><![CDATA[Reply to Multithreading, Speicher ans OS retournieren. on Fri, 20 Apr 2012 18:37:24 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Ich weiss um die Numerik dahinter Bescheid, nur kann ich den Zusammenhang mit Valgrind nicht herstellen. Valgrind installiert Hooks fuer free und malloc und fuehrt dein Programm aus und tracked deinen Speicher. Dabei kann ich keinen Einfluss auf numerische Berechnungen feststellen. Wo rundet Valgrind?</p>
</blockquote>
<p>Naja, etwas mehr tut Valgrind sicher. Nach meinem Verständnis dürfte es<br />
einen Prozessor simulieren und den Programmcode interpretieren. Anders<br />
ist die Rundungsdifferenz nicht zu erklären, und die Performance ist ja<br />
auch deutlich schlechter. Ah, na bitte, hier ist Info zum Thema:</p>
<p><a href="https://lists-sop.inria.fr/sympa/arc/cgal-discuss/2008-05/msg00151.html" rel="nofollow">https://lists-sop.inria.fr/sympa/arc/cgal-discuss/2008-05/msg00151.html</a><br />
<a href="http://valgrind.org/docs/manual/manual-core.html" rel="nofollow">http://valgrind.org/docs/manual/manual-core.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2204096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2204096</guid><dc:creator><![CDATA[memr]]></dc:creator><pubDate>Fri, 20 Apr 2012 18:37:24 GMT</pubDate></item></channel></rss>