<?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[vector iterator not deferencable]]></title><description><![CDATA[<p>ich habe hier ein ganz komisches problem:</p>
<p>ich erstelle in einer meiner methoden einen thread der eine andere methode aufruft.</p>
<pre><code class="language-cpp">class test {

public:

  void methode1();
  void methode2();

private:

 meineStruct me;
 vector&lt;std::thread&gt; t;
 vector&lt;meineStruct&gt; s;
};
</code></pre>
<pre><code class="language-cpp">void Test::methode1() {

  me.WasAuchImmer = &quot;Foo&quot;;

  t.push_back(&amp;Test::methode2, this);
  s.push_back(me);
}

void Test::methode2() {

  std::cout &lt;&lt; s.front().WasAuchImmer &lt;&lt; std::endl;
}
</code></pre>
<p>wenn ich in meinem programm nun methode1() aufrufe bekomme ich folgende fehlermeldung: vector iterator not deferencable<br />
wenn ich jedoch in methode2() ein cout davorsetze:</p>
<pre><code class="language-cpp">void Test::methode2() {
  std::cout &lt;&lt; s.size() &lt;&lt; std::endl;
  std::cout &lt;&lt; s.front().WasAuchImmer &lt;&lt; std::endl;
}
</code></pre>
<p>... funktioniert es einwandfrei. Wieso?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307829/vector-iterator-not-deferencable</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 09:02:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307829.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Sep 2012 11:30:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to vector iterator not deferencable on Thu, 06 Sep 2012 11:30:09 GMT]]></title><description><![CDATA[<p>ich habe hier ein ganz komisches problem:</p>
<p>ich erstelle in einer meiner methoden einen thread der eine andere methode aufruft.</p>
<pre><code class="language-cpp">class test {

public:

  void methode1();
  void methode2();

private:

 meineStruct me;
 vector&lt;std::thread&gt; t;
 vector&lt;meineStruct&gt; s;
};
</code></pre>
<pre><code class="language-cpp">void Test::methode1() {

  me.WasAuchImmer = &quot;Foo&quot;;

  t.push_back(&amp;Test::methode2, this);
  s.push_back(me);
}

void Test::methode2() {

  std::cout &lt;&lt; s.front().WasAuchImmer &lt;&lt; std::endl;
}
</code></pre>
<p>wenn ich in meinem programm nun methode1() aufrufe bekomme ich folgende fehlermeldung: vector iterator not deferencable<br />
wenn ich jedoch in methode2() ein cout davorsetze:</p>
<pre><code class="language-cpp">void Test::methode2() {
  std::cout &lt;&lt; s.size() &lt;&lt; std::endl;
  std::cout &lt;&lt; s.front().WasAuchImmer &lt;&lt; std::endl;
}
</code></pre>
<p>... funktioniert es einwandfrei. Wieso?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249043</guid><dc:creator><![CDATA[HELP__]]></dc:creator><pubDate>Thu, 06 Sep 2012 11:30:09 GMT</pubDate></item><item><title><![CDATA[Reply to vector iterator not deferencable on Thu, 06 Sep 2012 11:33:22 GMT]]></title><description><![CDATA[<p>Achja,</p>
<pre><code class="language-cpp">t.push_back(&amp;Test::methode2, this);
</code></pre>
<p>muss natürlich so heißen:</p>
<pre><code class="language-cpp">t.push_back(std::thread(&amp;test::methode2, this));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2249046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249046</guid><dc:creator><![CDATA[HELP__]]></dc:creator><pubDate>Thu, 06 Sep 2012 11:33:22 GMT</pubDate></item><item><title><![CDATA[Reply to vector iterator not deferencable on Thu, 06 Sep 2012 11:40:25 GMT]]></title><description><![CDATA[<p>Race condition. Wenn die Methode2 ausgeführt wird, hat s bei s.front() wohl noch keine Elemente, da das s.push_back(me); noch nicht erfolgt ist. Durch das cout verzögert sich der Zugriff genug, dass im Hauptthread mittlerweile ein Element zu s hinzu gefügt wurde. Oder umgekehrt wird durch das push_back vielleicht der front-Iterator ungültig, zwischen dem Zeitpunkt wo er geholt wird und dem Zeitpunkt, an dem er dereferenziert wird. Kommt auf den Gesamtkontext an.</p>
<p>Allgemein: Die STL-Container sind in der Regel nicht threadsicher. Wenn ein Thread schreibend zugreift, ganz besonders wenn er wie hier Iteratoren ungültig machen kann, dann musst du das absichern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249049</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 06 Sep 2012 11:40:25 GMT</pubDate></item><item><title><![CDATA[Reply to vector iterator not deferencable on Thu, 06 Sep 2012 11:44:48 GMT]]></title><description><![CDATA[<p>klingt logisch, was gibt es denn für möglichkeiten sowas abzusichern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249052</guid><dc:creator><![CDATA[HELP__]]></dc:creator><pubDate>Thu, 06 Sep 2012 11:44:48 GMT</pubDate></item><item><title><![CDATA[Reply to vector iterator not deferencable on Thu, 06 Sep 2012 12:05:18 GMT]]></title><description><![CDATA[<p>HELP__ schrieb:</p>
<blockquote>
<p>klingt logisch, was gibt es denn für möglichkeiten sowas abzusichern?</p>
</blockquote>
<p>Wenn du mit Threads arbeitest, dann empfehle ich ganz dringend, dazu ein Tutorial zu lesen. Selbst wenn ich dir jetzt was von std::mutex erzähle: Learning by doing funktioniert hier nur schlecht. Du musst schon einen Plan haben und die Mittel der Sprache kennen (eine Referenz reicht da nicht), sonst läufst du direkt in das nächste Problem. Denn mögliche Probleme gibt es bei der nebenläufigen Programmierung sehr viele, du hast gerade einen der einfachsten Problemfälle gefunden.</p>
<p>Du musst auch ein gutes Gefühl über den Aufbau von Datenstrukturen haben, damit du weißt, was erlaubt ist und was nicht. Es ist beispielsweise kein Problem, gleichzeitig auf verschiedene Elemente eines vectors zuzugreifen, da wäre eine Absicherung bloß unnötiger Overhead.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249067</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 06 Sep 2012 12:05:18 GMT</pubDate></item><item><title><![CDATA[Reply to vector iterator not deferencable on Thu, 06 Sep 2012 12:12:10 GMT]]></title><description><![CDATA[<p>ich habe jetzt zum beispiel das hier gefunden: <a href="http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-4-protecting-shared-data.html" rel="nofollow">http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-4-protecting-shared-data.html</a> - taugt das was?</p>
<p>und noch eine letzte kleine zwischenfrage:</p>
<p>mit zugreifen meinst du lesend zugreifen? weil wenn ich zum beispiel in einem thread die größe des vectors halbiere und gleichzeitig in einem anderen thread auf einen teil des gerade gelöschten vectors zugreife kann das ja nur schiefgehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249070</guid><dc:creator><![CDATA[HELP__]]></dc:creator><pubDate>Thu, 06 Sep 2012 12:12:10 GMT</pubDate></item><item><title><![CDATA[Reply to vector iterator not deferencable on Thu, 06 Sep 2012 12:25:28 GMT]]></title><description><![CDATA[<p>HELP__ schrieb:</p>
<blockquote>
<p>mit zugreifen meinst du lesend zugreifen?</p>
</blockquote>
<p>Allgemein darfst du nicht gleichzeitig etwas ändern, worauf ein anderer Thread gerade zugreift, egal ob Lesend oder Schreibend. Der Trick ist zu wissen, welche Operationen an einer Datenstruktur welche Arten von Änderungen zur Folge haben können.</p>
<blockquote>
<p>ich habe jetzt zum beispiel das hier gefunden: <a href="http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-4-protecting-shared-data.html" rel="nofollow">http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-4-protecting-shared-data.html</a> - taugt das was?</p>
</blockquote>
<p>Sieht auf den ersten Blick brauchbar aus, ist aber unvollständig. Letzter Beitrag von 2012 wo ein nächster Teil angekündigt wird. Das verheißt nichts gutes.</p>
<p>Eventuell wäre es besser, erst einmal allgemein etwas zu Threads zu lernen und sich dann anzusehen, wie das in C++ gemacht wird. Das Online-Material zu C++11-Threads ist meiner Erfahrung nach noch ziemlich dünn. Vielleicht wäre ein Buch etwas für dich:<br />
<a href="http://www.c-plusplus.net/forum/302555" rel="nofollow">http://www.c-plusplus.net/forum/302555</a><br />
Mindestens in dem zweiten gibt es gleich mehrere Kapitel über die C++11-Threads (in dem anderen Buch aber bestimmt auch, ich kenne es bloß nicht). Setzt aber ein bisschen voraus, dass man schon ungefähr weiß, was man da tut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249073</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 06 Sep 2012 12:25:28 GMT</pubDate></item><item><title><![CDATA[Reply to vector iterator not deferencable on Thu, 06 Sep 2012 12:32:09 GMT]]></title><description><![CDATA[<p>Hier ist ein gutes Buch für Dich:<br />
&quot;C++ Concurrency in Action&quot;</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249077</guid><dc:creator><![CDATA[Travor]]></dc:creator><pubDate>Thu, 06 Sep 2012 12:32:09 GMT</pubDate></item><item><title><![CDATA[Reply to vector iterator not deferencable on Thu, 06 Sep 2012 16:42:28 GMT]]></title><description><![CDATA[<p>habe mir jetzt mal &quot;C++11 programmieren&quot; und &quot;C++ Concurrency in Action&quot; bestellt, danke für die tipps <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249200</guid><dc:creator><![CDATA[HELP__]]></dc:creator><pubDate>Thu, 06 Sep 2012 16:42:28 GMT</pubDate></item></channel></rss>