<?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[(fast) gleichzeitig Elemente Vectoren hinzufügen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich führe viele Threads gleichzeitig aus, alle Threads erhalten u.a. die Adresse eines Vectors, der Pointer von Objekten enthält. Die Threads erstellen Objekte und fügen dann einen Pointer auf die Objekte dem Vector an.</p>
<p>Im Allgemeinen laufen die Threads eine längere Zeit, da sie warten müssen, bis eine bestimmte Datei heruntergeladen wurde. Nachdem alle Threads fertig sind, greife ich auf die Objekte zu und das Programm stürzt gelegentlich ab.</p>
<p>Um den Fehler zu finden, greife ich auf keine Objekte zu und lasse die Threads nicht warten (Dateien sind lokal schon verfügbar, müssen also nicht heruntergeladen werden). Es werden also fast gleichzeitig viele Objekte erstellt und Pointer auf sie einem Vektor angehangen.</p>
<p>Interessanterweise stürzt dann das Programm fast immer ab. Kommentiere ich das Anfügen an Vector aus, kommt es zu keinem Absturz.</p>
<p>Ist es legitim, dass viele Threads fast gleichzeitig Elemente einem Vector hinzufügen? Oder kommen die sich dann ins Gehege?</p>
<p>Falls wirklich das das Problem ist: Gibt es noch eine elegantere Methode, also jedem Thread seinen eigenen Vector bereitzustellen und später alle zusammenzufügen? (z.B. dass die Threads warten, bis der Vector nicht mehr arbeitet?)</p>
<p>Ich danke euch!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/300016/fast-gleichzeitig-elemente-vectoren-hinzufügen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 21:13:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/300016.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 23 Feb 2012 13:02:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Thu, 23 Feb 2012 13:02:06 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich führe viele Threads gleichzeitig aus, alle Threads erhalten u.a. die Adresse eines Vectors, der Pointer von Objekten enthält. Die Threads erstellen Objekte und fügen dann einen Pointer auf die Objekte dem Vector an.</p>
<p>Im Allgemeinen laufen die Threads eine längere Zeit, da sie warten müssen, bis eine bestimmte Datei heruntergeladen wurde. Nachdem alle Threads fertig sind, greife ich auf die Objekte zu und das Programm stürzt gelegentlich ab.</p>
<p>Um den Fehler zu finden, greife ich auf keine Objekte zu und lasse die Threads nicht warten (Dateien sind lokal schon verfügbar, müssen also nicht heruntergeladen werden). Es werden also fast gleichzeitig viele Objekte erstellt und Pointer auf sie einem Vektor angehangen.</p>
<p>Interessanterweise stürzt dann das Programm fast immer ab. Kommentiere ich das Anfügen an Vector aus, kommt es zu keinem Absturz.</p>
<p>Ist es legitim, dass viele Threads fast gleichzeitig Elemente einem Vector hinzufügen? Oder kommen die sich dann ins Gehege?</p>
<p>Falls wirklich das das Problem ist: Gibt es noch eine elegantere Methode, also jedem Thread seinen eigenen Vector bereitzustellen und später alle zusammenzufügen? (z.B. dass die Threads warten, bis der Vector nicht mehr arbeitet?)</p>
<p>Ich danke euch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2184677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2184677</guid><dc:creator><![CDATA[Ulf]]></dc:creator><pubDate>Thu, 23 Feb 2012 13:02:06 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Thu, 23 Feb 2012 13:06:46 GMT]]></title><description><![CDATA[<p>Ulf schrieb:</p>
<blockquote>
<p>Ist es legitim, dass viele Threads fast gleichzeitig Elemente einem Vector hinzufügen?</p>
</blockquote>
<p>Nein ist es nicht, du wirst ein Mutex brauchen.</p>
<p>Ulf schrieb:</p>
<blockquote>
<p>Falls wirklich das das Problem ist: Gibt es noch eine elegantere Methode, also jedem Thread seinen eigenen Vector bereitzustellen und später alle zusammenzufügen? (z.B. dass die Threads warten, bis der Vector nicht mehr arbeitet?)</p>
</blockquote>
<p>Eben z.B. eine Critical Section (Mutex).<br />
Abhängig von deiner Anwendung könnte das spätere Zusammenführen aber eine bessere Lösung sein, da die Threads sich dann nicht gegenseitig blockieren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2184679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2184679</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 23 Feb 2012 13:06:46 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Thu, 23 Feb 2012 13:13:44 GMT]]></title><description><![CDATA[<p>Ja sicher gibt's Lösungen zu deinem Problem. Ich bin mir zwar nicht sicher, aber vector&lt;T&gt; ist denke ich nicht Threadsafe! Such mach mal nach Mutex, Semaphor. Allgemeint heißt das Thema Threadsynchronisierung.</p>
<p>Es ist so, dass Threads ständig angehalten werden, deren Kontext gespeichert wird und ein anderer Thread dran kommt bis wieder ein Zeit vorbei ist und dann wieder dein Thread drankommt. Es lässt sich nicht bestimmen, wann, wie und wie schnell etc. die Threads laufen, dass regelt das OS. Deshalb MUSST du davon ausgehen, dass zwei Threads auch auf einem Singlecore gleichzeitig ausgeführt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2184681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2184681</guid><dc:creator><![CDATA[PhilippHToner]]></dc:creator><pubDate>Thu, 23 Feb 2012 13:13:44 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Thu, 23 Feb 2012 16:27:29 GMT]]></title><description><![CDATA[<p>Mal simpler Beispielcode:</p>
<pre><code class="language-cpp">#include &lt;atomic&gt;
#include &lt;mutex&gt;
#include &lt;future&gt;
#include &lt;thread&gt;
#include &lt;vector&gt;
#include &lt;iostream&gt;

template &lt;typename T, typename U&gt;
void atomic_push_back(std::vector&lt;T&gt;&amp; v, U&amp;&amp; var)
{
  static std::mutex m;
  std::lock_guard&lt;std::mutex&gt; guard(m);
  v.push_back(std::forward&lt;U&gt;(var));
}

void foo(std::vector&lt;int&gt;&amp; v)
{
	for (int i = 500; i--; )
		atomic_push_back(v, i);
}

int main()
{
  std::vector&lt;int&gt; v;
  std::vector&lt;std::thread&gt; threads;
  for (int i = 100; i--; )
    threads.push_back(std::thread(foo, std::ref(v)));
  for (auto i = threads.begin(); i != threads.end(); ++i)
    i-&gt;join();
  for (auto i = v.begin(); i != v.end(); ++i)
    std::cout &lt;&lt; *i &lt;&lt; ' ';
}
</code></pre>
<p>Ansonsten kannst du dir natürlich eine ein safe_vector Klasse oder so bauen und die benutzen. Ein push_back wird somit allerdings relativ teuer, das sollte dir klar sein. (Mir fällt aber kein performanterer Weg ein. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> )</p>
<p>Als zu bevorzugendes Design würde ich allerdings (insbesondere wenn es um so etwas wie Bilder runterladen geht) das hier vorschlagen:</p>
<pre><code class="language-cpp">#include &lt;atomic&gt;
#include &lt;mutex&gt;
#include &lt;future&gt;
#include &lt;thread&gt;
#include &lt;vector&gt;
#include &lt;iostream&gt;

std::vector&lt;char&gt; load_image(std::string url)
{
  // Beispielhaft
  std::vector&lt;char&gt; filebuf(url.c_str(), url.c_str() + url.length() + 1);
  return filebuf;
}

int main()
{
  std::vector&lt;std::future&lt;std::vector&lt;char&gt;&gt;&gt; files;
  for (int i = 100; i--; )
    files.push_back(std::async(load_image, &quot;lol.com&quot;));
  for (auto i = files.begin(); i != files.end(); ++i)
    std::cout &lt;&lt; &amp;i-&gt;get()[0] &lt;&lt; '\n';
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2184794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2184794</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 23 Feb 2012 16:27:29 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Thu, 23 Feb 2012 18:39:33 GMT]]></title><description><![CDATA[<p>Ich danke euch, damit hat alles geklappt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2184862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2184862</guid><dc:creator><![CDATA[Ulf]]></dc:creator><pubDate>Thu, 23 Feb 2012 18:39:33 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Thu, 23 Feb 2012 19:53:38 GMT]]></title><description><![CDATA[<p>Man sollte halt zusätzlich Funktionen anbieten, welche mehrere Pushs nach Möglichkeit bündeln. Dann kann ein Thread ein paar sammeln und dann gemeinsam an einen atomic_push übergeben. Auf diese Weise wird die Anzahl der Locks verringert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2184905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2184905</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Thu, 23 Feb 2012 19:53:38 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Thu, 23 Feb 2012 20:47:07 GMT]]></title><description><![CDATA[<p>Man könnte auch z.B. die lock() und unlock() Funktionen public machen, und ne rekursive Mutex nehmen (z.B. Critical Section unter Windows oder boost::recursive_mutex).</p>
<p>Oder man macht es wie es alle machen, und lässt Mutex und Vektor einfach getrennt <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/2184920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2184920</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 23 Feb 2012 20:47:07 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Fri, 24 Feb 2012 00:03:19 GMT]]></title><description><![CDATA[<p>Ulf schrieb:</p>
<blockquote>
<p>Hallo,<br />
Im Allgemeinen laufen die Threads eine längere Zeit, da sie warten müssen, bis eine bestimmte Datei heruntergeladen wurde. Nachdem alle Threads fertig sind, greife ich auf die Objekte zu und das Programm stürzt gelegentlich ab.</p>
</blockquote>
<p>Du fängst doch sowieso erst nachdem alle threads fertig sind damit an, den vector zu verwenden, oder? Ich würde dann lieber in jedem thread einen eigenen vector füllen, alle threads joinen und danach alle vectoren zusammenfügen. Damit vermeidest du mutex und (wenn die threads tatsächlich ansonsten alles asynchron machen) race conditions.<br />
Wenn die Anzahl der geladenen Objekte bei jedem thread schon im Voraus bekannt sind, kannst du auch einen einzigen vector am Anfang auf die richtige Größe bringen und jedem thread einen entsprechenden Abschnitt zum Beschreiben mitgeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2184988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2184988</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Fri, 24 Feb 2012 00:03:19 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Fri, 24 Feb 2012 16:34:50 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Mal simpler Beispielcode:</p>
<pre><code class="language-cpp">#include &lt;atomic&gt;
#include &lt;mutex&gt;
#include &lt;future&gt;
#include &lt;thread&gt;
#include &lt;vector&gt;
#include &lt;iostream&gt;

template &lt;typename T, typename U&gt;
void atomic_push_back(std::vector&lt;T&gt;&amp; v, U&amp;&amp; var)
{
  static std::mutex m;
  std::lock_guard&lt;std::mutex&gt; guard(m);
  v.push_back(std::forward&lt;U&gt;(var));
}

void foo(std::vector&lt;int&gt;&amp; v)
{
	for (int i = 500; i--; )
		atomic_push_back(v, i);
}

int main()
{
  std::vector&lt;int&gt; v;
  std::vector&lt;std::thread&gt; threads;
  for (int i = 100; i--; )
    threads.push_back(std::thread(foo, std::ref(v)));
  for (auto i = threads.begin(); i != threads.end(); ++i)
    i-&gt;join();
  for (auto i = v.begin(); i != v.end(); ++i)
    std::cout &lt;&lt; *i &lt;&lt; ' ';
}
</code></pre>
</blockquote>
<pre><code class="language-cpp">std::vector&lt;int&gt; v;
//...

atomic_push_back(v, 0); //U ist int &amp;&amp;

//.. währenddessen in einem weit, weit entfernten Thread
const int i = 10;
atomic_push_back(v, i); //U ist const int &amp; -&gt; andere Funktion -&gt; anderer Mutex -&gt; bäm
</code></pre>
<p>Ein schönes Beispiel, warum <code>static</code> bei lokalen Variablen böse ist und Missbrauch von Gebrauch oft schwer zu unterscheiden ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185306</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Fri, 24 Feb 2012 16:34:50 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Sat, 25 Feb 2012 10:50:12 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">static std::mutex m;
</code></pre>
</blockquote>
<p>Und wer garantiert dir, dass die Erstellung des Mutex atomar ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185530</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 25 Feb 2012 10:50:12 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Sat, 25 Feb 2012 16:30:55 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Ein schönes Beispiel, warum <code>static</code> bei lokalen Variablen böse ist und Missbrauch von Gebrauch oft schwer zu unterscheiden ist.</p>
</blockquote>
<p>Autsch. Wobei ich es eher als Beispiel dafür sehen würde, dass man bei Templates nicht vergessen sollte, dass das unterschiedliche Funktionen werden. <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/2185649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185649</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 25 Feb 2012 16:30:55 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Sat, 25 Feb 2012 18:40:47 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>cooky451 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">static std::mutex m;
</code></pre>
</blockquote>
<p>Und wer garantiert dir, dass die Erstellung des Mutex atomar ist?</p>
</blockquote>
<p>muss sie nicht. gcc kann es auf jeden fall; msvc weiß ich gerade nicht, sollte aber auch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185750</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 25 Feb 2012 18:40:47 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Sat, 25 Feb 2012 18:53:23 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>cooky451 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">static std::mutex m;
</code></pre>
</blockquote>
<p>Und wer garantiert dir, dass die Erstellung des Mutex atomar ist?</p>
</blockquote>
<p>Ob die Erstellung der Mutex atomar ist oder nicht, ist vollkommen egal.</p>
<p>Wenn nämlich die Chance besteht dass man auf die Mutex zugreift während diese gerade initialisiert wird, dann besteht genauso auch die Chance dass man auf die Mutex zugreift bevor überhaupt angefangen wurde sie zu initialisieren.</p>
<p>Ob die noch-nicht-angefangene Initialisierung atomar ist oder nicht spielt dann überhaupt keine Rolle mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185756</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 25 Feb 2012 18:53:23 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Sat, 25 Feb 2012 19:07:03 GMT]]></title><description><![CDATA[<p>Und wenn der Mutex 2 mal initialisiert wird und dabei Daten des zuerst &quot;fertig&quot; erstellten Mutex überschrieben werden? :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185759</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 25 Feb 2012 19:07:03 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Sat, 25 Feb 2012 19:43:20 GMT]]></title><description><![CDATA[<p>Insgesamt war die Idee eines lokalen statischen mutex eigentlich ziemlicher Schwachsinn, wenn man sich nur mal überlegt, wie man das erweitern möchte. Da hat man dann ein atomic_pop_front() und die bekommt wieder ein extra mutex? Doppelt aua. Eine safe_vector* Klasse ist wohl doch die einzig passable Lösung. (Abgesehen natürlich von std::future mit std::async, was ich bevorzugen würde wenn es geht.)</p>
<p>* Und dann am besten auch gleich nicht vector nennen, sondern sondern nach etwas was besser passt. (Und dann auch ein verringertes Interface anbieten.) Sonst kommt noch jemand auf die Idee Algorithmen mit dem Vektor aufzurufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185771</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 25 Feb 2012 19:43:20 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Sat, 25 Feb 2012 21:03:08 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Und wenn der Mutex 2 mal initialisiert wird und dabei Daten des zuerst &quot;fertig&quot; erstellten Mutex überschrieben werden? :p</p>
</blockquote>
<p>Ach, das ist ein function-local static.<br />
Nachdem du den Kontext in deinem Zitat unterschlagen hast, war das nicht ersichtlich, und ich dachte das Ding wäre global.</p>
<p>Ja, function-local statics sind in pre-C++ 11 Zeiten ein potentielles thread-safety Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2185793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2185793</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 25 Feb 2012 21:03:08 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Mon, 27 Feb 2012 12:57:32 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe noch ein neues Problem in Anlehnung an diese Problematik.</p>
<p>Ich starte zwei Threads, die jeweils einen Pointer auf das gleiche Objekt erhalten. Um sicherzugehen, habe ich mal im ganzen Thread, außer während eines Download, Mutex gelocked.</p>
<p>Hier ein Auszug der Funktion, die als Thread ausgeführt wird:</p>
<pre><code class="language-cpp">//MUTEX BEGIN
	if (pthread_mutex_lock(&amp;mutex) != 0){cout &lt;&lt; &quot;[FATAL] COULD NOT LOCK MUTEX&quot;;}

//irgendwelcher thread-unsicherer Code
		if (blabla){
//irgendwelcher thread-unsicherer Code
			if (pthread_mutex_unlock(&amp;mutex) != 0){cout &lt;&lt; &quot;[FATAL] COULD NOT UNLOCK MUTEX&quot;;}
//MUTEX END
			etc_lib().download_file(url, localfile);
//MUTEX BEGIN
			if (pthread_mutex_lock(&amp;mutex) != 0){cout &lt;&lt; &quot;[FATAL] COULD NOT LOCK MUTEX&quot;;}
		}
		try{
			string s = ArticleView-&gt;get_settingsreader()-&gt;get_value(&quot;temp_download_directory&quot;);
			s += ArticleView-&gt;get_article()-&gt;hash + &quot;.htm&quot;;
			article* a = ArticleView-&gt;get_article();
			...
</code></pre>
<p>Ich sehe, dass der zweite Thread erst startet (bzw. in den unsicheren Code geht), wenn im ersten Thread der Download beginnt. Beide Downloads starten dann. Wenn ein Thread mit dem Download fertig ist, geht er weiter in den try Block, der andere Thread wartet. So sollte das ja auch sein.</p>
<p>Dummerweise stürzt der Programm immer in während der ersten beiden Zeilen (meist in der ersten) vom try-Block ab. An den Methoden kann es nicht liegen, ohne Parallelisierung klappt das. Allerdings nutzen beide Threads den gleichen Pointer ArticleView und damit auch das gleiche Objekt settingsreader. Die Methode settingsreader()-&gt;get_value() sucht in einem Member-Vector nach dem übergebenden Parameter.</p>
<p>Da beide Threads vor dem Download die Objekte genutzt haben, kann es sein, dass der eine Thread das Objekt noch irgendwie blockiert oder nutzt?</p>
<p>Habe ich da etwas grundsätzlich falsch verstanden?</p>
<p>Ich danke euch schonmal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186184</guid><dc:creator><![CDATA[Ulf]]></dc:creator><pubDate>Mon, 27 Feb 2012 12:57:32 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Wed, 29 Feb 2012 09:42:10 GMT]]></title><description><![CDATA[<p>hat niemand eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186904</guid><dc:creator><![CDATA[Ulf]]></dc:creator><pubDate>Wed, 29 Feb 2012 09:42:10 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Wed, 29 Feb 2012 12:45:49 GMT]]></title><description><![CDATA[<p>Doch, debugger nehmen und die !genaue! Stelle im Code finden. Ich tippe auf eine Dereferenzierung eines Nullpointers.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186967</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 29 Feb 2012 12:45:49 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Wed, 29 Feb 2012 14:19:13 GMT]]></title><description><![CDATA[<p>Meist bricht er in der ersten Zeile des try-Blocks ab. Das ist die Methode:</p>
<pre><code class="language-cpp">string settings_reader::get_value(string setting_name)
{
	for (int i = 0; i &lt; m_setting.size(); i++)   // m_settings ist ein vector&lt;string&gt;
		if (m_setting[i] == setting_name){   // Abbruch
			return m_values[i];
		}
	return &quot;nA&quot;;
}
</code></pre>
<p>Beim Debuggen brach er einmal im zweiten Durchlauf, einmal beim ersten Durchlauf ab. Die Fehlermeldung(en): manchmal &quot;*** Abgestürzt mit Rückgabewert: 0 <em><strong>&quot;, manchmal &quot;</strong></em> Programm hat Signal SIGSEGV (Segmentation fault) empfangen ***&quot;.</p>
<p>Auf dieses Objekt haben ja beide Threads Zugriff, bzw. vorher auch schon genutzt. Kann es da sein, dass der eine Thread, der eigentlich wartet, das Objekt, bzw. dessen vector noch blockiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2186998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2186998</guid><dc:creator><![CDATA[Ulf]]></dc:creator><pubDate>Wed, 29 Feb 2012 14:19:13 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Wed, 29 Feb 2012 14:47:25 GMT]]></title><description><![CDATA[<p>Ist i innerhalb der Größe des vectors?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2187011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2187011</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 29 Feb 2012 14:47:25 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Wed, 29 Feb 2012 15:17:06 GMT]]></title><description><![CDATA[<p>Wie ich schon gesagt habe, kann es nicht an der Methode selber liegen, da mit einem Thread alles läuft, der Fehler aber erst bei zwei gleichzeitigen Threads kommt. Die Threads selber ändern die Objekte nicht. (Mir fällt dabei auf, dass ich die Methode nicht als const definiert habe, ist gerade nachgeholt worden).</p>
<p>edit: hier stand Mist. Beide Vektoren haben die gleiche Größe, das ist garantiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2187019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2187019</guid><dc:creator><![CDATA[Ulf]]></dc:creator><pubDate>Wed, 29 Feb 2012 15:17:06 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Wed, 29 Feb 2012 15:10:49 GMT]]></title><description><![CDATA[<p>Mach doch einfach mal ein assert(m_setting.size() == m_values.size() ) an den Anfang.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2187021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2187021</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 29 Feb 2012 15:10:49 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Wed, 29 Feb 2012 15:22:08 GMT]]></title><description><![CDATA[<p>Ich habe mir die Größe der Vektoren auch explizit ausgeben lassen, beide sind immer gleich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2187029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2187029</guid><dc:creator><![CDATA[Ulf]]></dc:creator><pubDate>Wed, 29 Feb 2012 15:22:08 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Wed, 29 Feb 2012 15:23:47 GMT]]></title><description><![CDATA[<p>Was passiert den, wenn du in der Funktion einfach immer &quot;nA&quot; zurück gibst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2187030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2187030</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 29 Feb 2012 15:23:47 GMT</pubDate></item><item><title><![CDATA[Reply to (fast) gleichzeitig Elemente Vectoren hinzufügen on Wed, 29 Feb 2012 16:52:03 GMT]]></title><description><![CDATA[<p>Das ist schwierig, weil die Methode schon vorher öfters benutzt wird. Ich habe aber mal die Zeile auskommentiert und stattdessen explizit einen Wert angegeben:</p>
<pre><code class="language-cpp">// 			string s = ArticleView-&gt;get_settingsreader()-&gt;get_value(&quot;temp_download_directory&quot;);
			string s = &quot;/tmp/&quot;;
			s += ArticleView-&gt;get_article()-&gt;hash + &quot;.htm&quot;;
			article* a = ArticleView-&gt;get_article();
</code></pre>
<p>Das Programm bricht dann bei der nachfolgenden Zeile, bzw. beim Aufruf von ArticleView-&gt;get_article()-&gt;hash. Auch ArticleView ist ein Pointer, den beide Threads nutzen. Auch hier bricht er nur ab, wenn ich das mit zwei Threads gleichzeitig ausführe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2187061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2187061</guid><dc:creator><![CDATA[Ulf]]></dc:creator><pubDate>Wed, 29 Feb 2012 16:52:03 GMT</pubDate></item></channel></rss>