<?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[Mutex und Vektor]]></title><description><![CDATA[<p>Es ist mein erstes größeres Projekt in C++ und arbeite das erste mal mit Boost::Mutex um einen Vektor Thread Safe zu machen.</p>
<pre><code>class a{

//Ist die DirectX Render() Funktion, wird also oft aufgerufen, hat hohe Priorität
void Render()
{
     //Liest etwas aus dem Vektor. Natürlich schlecht programmiert da direkter Zugriff auf eigentlich private Variable
    ... = b.meinVektor_[i]...
}

//Funktion2 läuft in einem anderen Thread
void Funktion2
{

 while(true)
 {
     b.LadeWasInDenVektor()
 }

}

}

class b
{
std::vector&lt;CustomStruct&gt; meinVektor_;

void FuktionLadeWasInDenVektor
{
   meinVektor_.push_back(xyz);
}

}
</code></pre>
<p>Meine Frage ist nun, was der beste Ansatz wäre den Vektor davor zu schützen, gelesen zu werden, falls gerade in dem anderen Thread geschrieben wird und vice versa.</p>
<p>Wäre solch eine get Methode sinnvoll / überhaupt sicher?</p>
<pre><code>class b
{
std::vector&lt;CustomStruct&gt; meinVektor_;

std::vector&lt;CustomStruct&gt;* MeinVektor
{
   boost::lock_guard&lt;boost::mutex&gt; lock(meinMutex_); 
   return &amp;meinVektor_;
}

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/322474/mutex-und-vektor</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Jul 2026 21:37:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/322474.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 22 Dec 2013 18:02:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mutex und Vektor on Sun, 22 Dec 2013 18:02:21 GMT]]></title><description><![CDATA[<p>Es ist mein erstes größeres Projekt in C++ und arbeite das erste mal mit Boost::Mutex um einen Vektor Thread Safe zu machen.</p>
<pre><code>class a{

//Ist die DirectX Render() Funktion, wird also oft aufgerufen, hat hohe Priorität
void Render()
{
     //Liest etwas aus dem Vektor. Natürlich schlecht programmiert da direkter Zugriff auf eigentlich private Variable
    ... = b.meinVektor_[i]...
}

//Funktion2 läuft in einem anderen Thread
void Funktion2
{

 while(true)
 {
     b.LadeWasInDenVektor()
 }

}

}

class b
{
std::vector&lt;CustomStruct&gt; meinVektor_;

void FuktionLadeWasInDenVektor
{
   meinVektor_.push_back(xyz);
}

}
</code></pre>
<p>Meine Frage ist nun, was der beste Ansatz wäre den Vektor davor zu schützen, gelesen zu werden, falls gerade in dem anderen Thread geschrieben wird und vice versa.</p>
<p>Wäre solch eine get Methode sinnvoll / überhaupt sicher?</p>
<pre><code>class b
{
std::vector&lt;CustomStruct&gt; meinVektor_;

std::vector&lt;CustomStruct&gt;* MeinVektor
{
   boost::lock_guard&lt;boost::mutex&gt; lock(meinMutex_); 
   return &amp;meinVektor_;
}

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2373291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373291</guid><dc:creator><![CDATA[Patrickssj6]]></dc:creator><pubDate>Sun, 22 Dec 2013 18:02:21 GMT</pubDate></item><item><title><![CDATA[Reply to Mutex und Vektor on Sun, 22 Dec 2013 18:18:52 GMT]]></title><description><![CDATA[<p>Patrickssj6 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::vector&lt;CustomStruct&gt;* MeinVektor
{
   boost::lock_guard&lt;boost::mutex&gt; lock(meinMutex_); 
   return &amp;meinVektor_;
}
</code></pre>
</blockquote>
<p>Also dass das sinnlos, ist dir hoffentlich bewusst, sonst muss ich dir von Multithreading definitiv abraten.</p>
<p>Generell ist in deinem Fall Locking eher kontraproduktiv, da eh alles sequenziell abläuft (schreiben -&gt; rendern -&gt; schreiben -&gt; rendern). Da würde ich auf Multithreading gleich verzichten, das kostet mehr als es bringt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373294</guid><dc:creator><![CDATA[tresorsafe]]></dc:creator><pubDate>Sun, 22 Dec 2013 18:18:52 GMT</pubDate></item><item><title><![CDATA[Reply to Mutex und Vektor on Sun, 22 Dec 2013 18:36:42 GMT]]></title><description><![CDATA[<p>Mein jetziger Code funktioniert leistungstechnisch sehr gut, nur stürzt gelegentlich das Programm wegen der mangelnden Thread Safety ab.</p>
<p>Der zweite Thread lädt halt Teile der Welt in den Speicher und generiert die Buffer die in den Vektor gesetzt werden welche dann von der Render Methode abgerufen werden.</p>
<p>-&gt;<br />
Thread 1 (Render) ruft Elemente aus dem Vektor auf<br />
Thread 2 füllt den Vektor mit Elementen</p>
<p>Der Vektor wird nur größer, nie kleiner.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373296</guid><dc:creator><![CDATA[Patrickssj6]]></dc:creator><pubDate>Sun, 22 Dec 2013 18:36:42 GMT</pubDate></item><item><title><![CDATA[Reply to Mutex und Vektor on Sun, 22 Dec 2013 18:45:06 GMT]]></title><description><![CDATA[<p>Patrickssj6 schrieb:</p>
<blockquote>
<p>Mein jetziger Code funktioniert leistungstechnisch sehr gut, nur stürzt gelegentlich das Programm wegen der mangelnden Thread Safety ab.</p>
</blockquote>
<p>Das ist so wie zu sagen &quot;mein Flugzeug ist zwar sehr schnell, nur stürzt es gelegentlich wegen der mangelnden Safety ab&quot;. Performance ist bedeutungslos, wenn dein Programm nicht funktioniert.</p>
<p>Einen Zeiger auf den <code>vector</code> zurückzugeben und diese Methode &quot;threadsicher&quot; zu machen ist natürlich witzlos. Wichtig ist, das du parallele Zugriffe auf den Vector selbst ausschliesst. Dazu musst du ihn ordentlich kapseln, nicht einfach Zeiger auf Member herumreichen.</p>
<p>Bist du sicher, dass du nicht ohne Multithreading auskommst? Die Thematik wird sehr oft unterschätzt, und du machst dir das Leben unnötig schwer. Du solltest mindestens C++ gut beherrschen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373297</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 22 Dec 2013 18:45:06 GMT</pubDate></item><item><title><![CDATA[Reply to Mutex und Vektor on Mon, 23 Dec 2013 01:43:41 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Patrickssj6 schrieb:</p>
<blockquote>
<p>Mein jetziger Code funktioniert leistungstechnisch sehr gut, nur stürzt gelegentlich das Programm wegen der mangelnden Thread Safety ab.</p>
</blockquote>
<p>Das ist so wie zu sagen &quot;mein Flugzeug ist zwar sehr schnell, nur stürzt es gelegentlich wegen der mangelnden Safety ab&quot;. Performance ist bedeutungslos, wenn dein Programm nicht funktioniert.</p>
</blockquote>
<p>Das ist eine unpassende Analogie da mein Programm wunderbar läuft, ich für nur ein bestimmten Algorithmus Multithreading <em>ausprobiert</em> habe.</p>
<p>Das Problem ist, die Welt ist sehr groß und ich muss sie in Abschnitten laden. Jeder Abschnitt bräuchte aber zu viel Zeit zum laden als dass ich die einfach in die Hauptschleife einbinden könnte.</p>
<p>Ich habe Jahrelang in C# geschrieben und brauchte für ein Projekt mehr low-level control und hab es in C++/DirectX geschrieben. Ich parse existierende Dateien in eigene Dateienformate, map die Dateien in den Speicher und map darauf Structs, habe eigene Algorithmen geschrieben um die CPU/GPU zu entlasten und alles soll jetzt an Multithreading scheitern? Dass mein Code nicht irgendeinem Konform entspricht und generell verbesserungswürdig ist, ist mir klar.</p>
<p>Das existierende Framework wird bald sowieso neu geschrieben und ich wollte nur fragen, was eine gute Lösung für das Problem wäre. Mein Lösungsbeispiel ist natürlich banal und ich habe nicht daran geglaubt dass es funktioniert, nur ich dachte es wäre vielleicht besser irgendeinen Ansatz zu zeigen damit das ganze nicht als &quot;spoon feeding&quot; rüberkommt. Der Ansatz mit dem Kapseln war ja da, aber genau dort ist die Frage: Wie genau und wo macht es Sinn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373327</guid><dc:creator><![CDATA[Patrickssj6]]></dc:creator><pubDate>Mon, 23 Dec 2013 01:43:41 GMT</pubDate></item><item><title><![CDATA[Reply to Mutex und Vektor on Mon, 23 Dec 2013 16:29:39 GMT]]></title><description><![CDATA[<p>Patrickssj6 schrieb:</p>
<blockquote>
<p>Mein Lösungsbeispiel ist natürlich banal und ich habe nicht daran geglaubt dass es funktioniert, nur ich dachte es wäre vielleicht besser irgendeinen Ansatz zu zeigen damit das ganze nicht als &quot;spoon feeding&quot; rüberkommt.</p>
</blockquote>
<p>Es macht nicht wirklich einen Unterschied ob da gar nix steht oder ein Beispiel das überhaupt keinen Sinn macht.</p>
<blockquote>
<p>Der Ansatz mit dem Kapseln war ja da, aber genau dort ist die Frage: Wie genau und wo macht es Sinn?</p>
</blockquote>
<p>Du musst dir schon selbst ein paar Artikel zu dem Thema durchlesen. Das ist zu umfangreich für &quot;mal eben schnell im Forum erklärt&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373422</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 23 Dec 2013 16:29:39 GMT</pubDate></item></channel></rss>