<?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[Threads in Klassen Problem und Frage?!?]]></title><description><![CDATA[<p>Hi, ich beschäftige mich schon länger mit C++.<br />
Nun bin ich auf ein kleines Problem gestossen und ich hoffe ihr könnt mir vielleicht helfen <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>
<p>Und zwar will ich in verschiedenen Klassen Threads erzeugen.<br />
Die Klassen sollen dabei vollautomatisch nachdem der Constructor ausgeführt wurde eine art<br />
WorkerJob ausführen die im EndlessLoop laufen. Z.B. jede Sekunde die Zeit abfragen und dann bestimmte Ereignisse innerhalb der<br />
Klasse ausführen. Dies ist vom Programmieren alles kein Problem für mich. Nur wenn ich ja einen Thread im EndlessLoop ausführen<br />
bekomme ich das Problem das die Klasse nach dem Ausführen des Threads im EndlessLoop verharrt (was ja durch den EndlessLoop geschied).<br />
mit &quot;Thread Detach&quot; kann ich das Problem ganz gut lösen. Ist der Ansatz überhaupt gut so? Kann ich mit detach überhaupt ein Mutex noch benutzen<br />
um zugriff auf eine Variable aus mehren Threads abzusichern?</p>
<p>Ab da mal eine DummyClasse erzeugt und diese in der Main Instanziert.</p>
<pre><code>* DummyClass.h

 */

#ifndef DUMMYCLASS_H_
#define DUMMYCLASS_H_

#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;thread&gt;
#include &lt;unistd.h&gt;

namespace std {

class DummyClass {
public:
	DummyClass(const int id);
	virtual ~DummyClass();
private:
	int id;
	std::thread t1;
	void print(const std::string &amp;text);
	void workerLoop();
};

}
#endif /* DUMMYCLASS_H_ */
</code></pre>
<pre><code>/*
 * DummyClass.cpp
 */

#include &quot;DummyClass.h&quot;

namespace std {

DummyClass::DummyClass(const int id) {
	print (&quot;created...&quot;);
	this-&gt;id = id;
	t1 = std::thread(&amp;DummyClass::workerLoop,this);
	t1.detach();
}

DummyClass::~DummyClass() {
	print(&quot;destroyed...&quot;);
}

void DummyClass::print(const std::string &amp;text){
	std::cout &lt;&lt; std::string(&quot;[DummyClass &quot;) &lt;&lt; id &lt;&lt; std::string(&quot;]&gt;&gt;\t&quot;) &lt;&lt; text &lt;&lt; std::endl;
}

void DummyClass::workerLoop(){
	print(&quot;start worker loop...&quot;);
	while(true){
		print(&quot;working...&quot;);
		sleep(1);
	}
}

} /* namespace std */
</code></pre>
<pre><code>int main() {

	print(&quot;start...&quot;);

	DummyClass *dummy = new DummyClass(1);
	DummyClass *dummy2 = new DummyClass(2);

	print (&quot;start main loop...&quot;);

	while (true) {
		sleep(1);
	}

	print(&quot;exit...&quot;);

	return 0;
}
</code></pre>
<p>Danke euch schonmal für die Antworten <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/topic/339967/threads-in-klassen-problem-und-frage</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 16:56:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339967.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 Oct 2016 07:01:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Threads in Klassen Problem und Frage?!? on Tue, 11 Oct 2016 07:01:50 GMT]]></title><description><![CDATA[<p>Hi, ich beschäftige mich schon länger mit C++.<br />
Nun bin ich auf ein kleines Problem gestossen und ich hoffe ihr könnt mir vielleicht helfen <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>
<p>Und zwar will ich in verschiedenen Klassen Threads erzeugen.<br />
Die Klassen sollen dabei vollautomatisch nachdem der Constructor ausgeführt wurde eine art<br />
WorkerJob ausführen die im EndlessLoop laufen. Z.B. jede Sekunde die Zeit abfragen und dann bestimmte Ereignisse innerhalb der<br />
Klasse ausführen. Dies ist vom Programmieren alles kein Problem für mich. Nur wenn ich ja einen Thread im EndlessLoop ausführen<br />
bekomme ich das Problem das die Klasse nach dem Ausführen des Threads im EndlessLoop verharrt (was ja durch den EndlessLoop geschied).<br />
mit &quot;Thread Detach&quot; kann ich das Problem ganz gut lösen. Ist der Ansatz überhaupt gut so? Kann ich mit detach überhaupt ein Mutex noch benutzen<br />
um zugriff auf eine Variable aus mehren Threads abzusichern?</p>
<p>Ab da mal eine DummyClasse erzeugt und diese in der Main Instanziert.</p>
<pre><code>* DummyClass.h

 */

#ifndef DUMMYCLASS_H_
#define DUMMYCLASS_H_

#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;thread&gt;
#include &lt;unistd.h&gt;

namespace std {

class DummyClass {
public:
	DummyClass(const int id);
	virtual ~DummyClass();
private:
	int id;
	std::thread t1;
	void print(const std::string &amp;text);
	void workerLoop();
};

}
#endif /* DUMMYCLASS_H_ */
</code></pre>
<pre><code>/*
 * DummyClass.cpp
 */

#include &quot;DummyClass.h&quot;

namespace std {

DummyClass::DummyClass(const int id) {
	print (&quot;created...&quot;);
	this-&gt;id = id;
	t1 = std::thread(&amp;DummyClass::workerLoop,this);
	t1.detach();
}

DummyClass::~DummyClass() {
	print(&quot;destroyed...&quot;);
}

void DummyClass::print(const std::string &amp;text){
	std::cout &lt;&lt; std::string(&quot;[DummyClass &quot;) &lt;&lt; id &lt;&lt; std::string(&quot;]&gt;&gt;\t&quot;) &lt;&lt; text &lt;&lt; std::endl;
}

void DummyClass::workerLoop(){
	print(&quot;start worker loop...&quot;);
	while(true){
		print(&quot;working...&quot;);
		sleep(1);
	}
}

} /* namespace std */
</code></pre>
<pre><code>int main() {

	print(&quot;start...&quot;);

	DummyClass *dummy = new DummyClass(1);
	DummyClass *dummy2 = new DummyClass(2);

	print (&quot;start main loop...&quot;);

	while (true) {
		sleep(1);
	}

	print(&quot;exit...&quot;);

	return 0;
}
</code></pre>
<p>Danke euch schonmal für die Antworten <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/2511173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511173</guid><dc:creator><![CDATA[cpp_Freak]]></dc:creator><pubDate>Tue, 11 Oct 2016 07:01:50 GMT</pubDate></item><item><title><![CDATA[Reply to Threads in Klassen Problem und Frage?!? on Tue, 11 Oct 2016 07:48:16 GMT]]></title><description><![CDATA[<p>Hallo cpp_Freak,</p>
<p>Willkommen im C++-Forum!</p>
<p>das 'detach' löst den (physikalischen) Thread von dem Thread-Objekt ab. Damit bekommst Du zwar unmittelbar keinen Fehler mehr, aber der Thread läuft weiter und greift ggf. auf Daten eines bereits gelöschten Objekts zu.</p>
<p>Die saubere Lösung wäre, den Thread wirklich zu beenden. Also in Deinem Fall etwa so:</p>
<pre><code>class DummyClass {
    // ...
private:
    bool running;
    int id;
    std::thread t1;
    // ...
};
</code></pre>
<pre><code>DummyClass::DummyClass(const int id) 
    : running( true )
    , id( id )
    , t1( &amp;DummyClass::workerLoop, this )
{
    print (&quot;created...&quot;);
}

DummyClass::~DummyClass() {
    running = false;
    print(&quot;before join...&quot;);
    t1.join();
    print(&quot;destroyed...&quot;);
}

void DummyClass::workerLoop(){
    print(&quot;start worker loop...&quot;);
    while( running ){
        print(&quot;working...&quot;);
        sleep(1);
    }
}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511179</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 11 Oct 2016 07:48:16 GMT</pubDate></item><item><title><![CDATA[Reply to Threads in Klassen Problem und Frage?!? on Tue, 11 Oct 2016 08:17:35 GMT]]></title><description><![CDATA[<p>Wie kommst du auf die Idee, deine Klasse im Namespace std zu implementieren?</p>
<p>Werner Salomon schrieb:</p>
<blockquote>
<pre><code>class DummyClass {
    // ...
private:
    bool running;
    int id;
    std::thread t1;
    // ...
};
</code></pre>
</blockquote>
<p>Es müsste</p>
<pre><code class="language-cpp">std::atomic&lt;bool&gt; running;
</code></pre>
<p>heißen, ansonsten sieht der Workerthread den geänderten Wert möglicherweise nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511185</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 11 Oct 2016 08:17:35 GMT</pubDate></item><item><title><![CDATA[Reply to Threads in Klassen Problem und Frage?!? on Tue, 11 Oct 2016 12:08:11 GMT]]></title><description><![CDATA[<p>Danke schonmal für die Antworten <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="🙂"
    /><br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a> Salomon<br />
Das es Probleme mit Detach geben kann ist mir bekannt <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>Meine Frage ist es nun wie kann ich in einer Klasse die Dauerhaft instanziert ist einen Endlessloop laufen lassen der dann bestimmte Dinge immer wieder abarbeitet ohne das Speicherzugrifffehler auftauchen können?</p>
<p>Es kann auch vorkommen das ich mehre Endlessloops benötige.</p>
<p>Oder müsste ich dann ggf eine Singleton Klasse machen die dann aus der Main immer eine Art UpdateMethode besitzt die ich dann in der Main polle?</p>
<p>Oder ist es sinnvoll ohne Endless Loop zu arbeiten und einfach immer wieder einen Thread wenn dieser beendet ist neu zu erzeugen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511221</guid><dc:creator><![CDATA[cpp_Freak]]></dc:creator><pubDate>Tue, 11 Oct 2016 12:08:11 GMT</pubDate></item><item><title><![CDATA[Reply to Threads in Klassen Problem und Frage?!? on Tue, 11 Oct 2016 12:46:45 GMT]]></title><description><![CDATA[<blockquote>
<p>kann ich in einer Klasse die Dauerhaft instanziert ist einen Endlessloop laufen lassen der dann bestimmte Dinge immer wieder abarbeitet ohne das Speicherzugrifffehler auftauchen können?</p>
</blockquote>
<p>Theorethisch ja, bis die klasse zerstört wird, bzw das programm beendet wird.<br />
Alle ressourcen die der Thread nutzt muessen natürlich so lange gültig bleiben.</p>
<p>Bis dahin ists recht einfach ....</p>
<p>DIe Frage ist eher, wie beendet man sowas sauber, ohne das programm immer abschiessen zu muessen ?</p>
<p>Also MainThread erzeugt Worker Threads<br />
Worker Threads arbeiten kontinuierlich</p>
<p>1. Was macht der MainThread nachdem die Threads erzeugt wurden ?<br />
2. Wie wird das Program beendet ?</p>
<p>Das musst du wissen !</p>
<p>Meistens hat man im Zusammenhang mit sowas eh ein EventHandling, aka Eventloop, wenn das beenden von irgendwas initiiert wird, was nicht in den Worker threads passiert / abgefangen wird ...</p>
<blockquote>
<p>Oder ist es sinnvoll ohne Endless Loop zu arbeiten und einfach immer wieder einen Thread wenn dieser beendet ist neu zu erzeugen?</p>
</blockquote>
<p>Nö, erzeugen und zerstören kostet Performance ... wiederverwenden macht mehr sinn. Am besten mit Threadpools, um die Anzahl der laufenden threads zu kontrollieren ...</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511227</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Tue, 11 Oct 2016 12:46:45 GMT</pubDate></item><item><title><![CDATA[Reply to Threads in Klassen Problem und Frage?!? on Tue, 11 Oct 2016 13:18:20 GMT]]></title><description><![CDATA[<p>Hallo cpp_Freak,</p>
<p>cpp_Freak schrieb:</p>
<blockquote>
<p>Meine Frage ist es nun wie kann ich in einer Klasse die Dauerhaft instanziert ist einen Endlessloop laufen lassen der dann bestimmte Dinge immer wieder abarbeitet ohne das Speicherzugrifffehler auftauchen können?</p>
</blockquote>
<p>So pauschal kann man das nicht beantworten. Es kommt da wirklich auf den Einzelfall an. Ansonsten kann ich Dir das Buch<br />
<a href="https://duckduckgo.com/?q=isbn+9781933988771&amp;cppnetbooks" rel="nofollow">C++ Concurrency in Action | ISBN: 9781933988771</a> 'C++ Concurrency in Action' empfehlen (ISBN = 9781933988771).<br />
Dort ist auf mehr als 500 Seiten beschrieben, wie man so was macht.</p>
<p>Am besten Du nennst uns ganz konkret ein kleines Beispiel, was in so einem WorkerThread passieren soll und welche Schnittstellen zum main-Thread Deiner Meinung nach dafür notwendig sind.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511237</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 11 Oct 2016 13:18:20 GMT</pubDate></item><item><title><![CDATA[Reply to Threads in Klassen Problem und Frage?!? on Tue, 11 Oct 2016 15:03:12 GMT]]></title><description><![CDATA[<p>Als Beispiel was genau passieren soll erkläre ich an einem Beispiel.</p>
<p>-Ich habe zb 3 Klassen und eine Main.<br />
-Es geht darum das 2 Klassen als Module ansehe die dann nur in der Main Instanziert werden und dann über ihren Konstruktor initalisiert werden und sich in den Klassen dann Endless Threads auch starten.<br />
-Zb soll ein Modul(Klasse) einen bestimmten Sensorwert abfragen und das ergebniss Parsen.<br />
-Die geparsten Daten werden dann an eine Public Methode einer Klasse die in dieser Instanziert wurde weitergegeben.<br />
-Die Klasse mit der Public Methode hat einen eigenen Worker Thread der dann bestimmte Sachen aus einer Vector Liste zu bestimmten urzeiten die Sensor Daten vergleicht usw....<br />
-Im klar Text sehe ich die Klassen als Module an die ich einfach instanziere und dann eigenständig laufen.<br />
-OOP und so sind mir seit Jahren geläufig <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="🙂"
    /><br />
-Es geht halt nur darum das ja 2 Threads oder mehrer vl auf ein Objekt zb Liste zugreifen und da ist es ja wichtig diese durch Mutex zu schützen. Nur geht das ja nicht mit Detach oder doch?<br />
-Bin mit dem Threading in C++ Klassen noch ein wenig neu <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/2511254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511254</guid><dc:creator><![CDATA[cpp_Freak]]></dc:creator><pubDate>Tue, 11 Oct 2016 15:03:12 GMT</pubDate></item><item><title><![CDATA[Reply to Threads in Klassen Problem und Frage?!? on Tue, 11 Oct 2016 15:25:11 GMT]]></title><description><![CDATA[<p>Hmmm...</p>
<p>Ok - versuche bitte das ganze noch einmal aus der Sicht eines Anwenders zu beschreiben. Mal angenommen, Dein Programm läuft auf einem PC oder Kleincomputer. Der User hat keine Ahnung von den internen Programmstrukturen. Er weiß, dass da zwei Sensoren angeschlossen sind, z.B. ein Druck- und ein Temperatursensor.</p>
<p>Wie würde so ein Anwender Dein Programm beschreiben? Was kann er damit machen? Was bringt dem User diese Liste und der Vergleich mit den Sensordaten?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511262</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 11 Oct 2016 15:25:11 GMT</pubDate></item></channel></rss>