<?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[Frage zu Thread aufruf?]]></title><description><![CDATA[<p>Wenn ich einen Thread erzeuge in der funktion foo, ist dann gewährleistet, das der zeiger pt in der Thread funktion (B) auch schon initialisert ist, bevor die funktion (A) verlassen wurde, da ja der zeiger p nach der funktion nicht mehr existiert.<br />
Hoffe die Frage ist berechtigt... da ich mich frage ob der Thread schon läuft bevor die funktion foo durchlaufen wurde.</p>
<pre><code class="language-cpp">THREADID ThreadId_;

void foo(){

   DATA *p= IRGENDWAS;
   int code = thread_create(Thread::EntryPoint, (void*) p, &amp; ThreadId_);
   //(A)
};

void * EntryPoint(void * pthis){

   DATA * pt = (DATA*)pthis;

  //(B)

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/192328/frage-zu-thread-aufruf</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 12:15:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/192328.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 Sep 2007 05:05:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Thread aufruf? on Thu, 13 Sep 2007 05:05:09 GMT]]></title><description><![CDATA[<p>Wenn ich einen Thread erzeuge in der funktion foo, ist dann gewährleistet, das der zeiger pt in der Thread funktion (B) auch schon initialisert ist, bevor die funktion (A) verlassen wurde, da ja der zeiger p nach der funktion nicht mehr existiert.<br />
Hoffe die Frage ist berechtigt... da ich mich frage ob der Thread schon läuft bevor die funktion foo durchlaufen wurde.</p>
<pre><code class="language-cpp">THREADID ThreadId_;

void foo(){

   DATA *p= IRGENDWAS;
   int code = thread_create(Thread::EntryPoint, (void*) p, &amp; ThreadId_);
   //(A)
};

void * EntryPoint(void * pthis){

   DATA * pt = (DATA*)pthis;

  //(B)

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1364375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364375</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 13 Sep 2007 05:05:09 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Thread aufruf? on Thu, 13 Sep 2007 05:12:04 GMT]]></title><description><![CDATA[<p>Beim Funktionsaufruf von thread_create wird eine Kopie von p auf den Stack gepusht. Das was an deine Threadfunktion übergeben wird, hängt von der thread_create Funktion ab, die kenn ich zwar nicht, aber ich nehme an, dass die das richtig macht. Viel wichtiger ist, worauf p zeigt. Wenn dasz.B. nur eine lokale Varibale von foo ist, dann krachts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364378</guid><dc:creator><![CDATA[hallobalusa]]></dc:creator><pubDate>Thu, 13 Sep 2007 05:12:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Thread aufruf? on Thu, 13 Sep 2007 05:50:15 GMT]]></title><description><![CDATA[<p>Also wenn ich die Frage richtig verstanden habe (es ist ja noch früh):</p>
<p>Deine Frage ist doch, ob nach der &quot;create_thread&quot;-Funktion p schon mit ordentlichen Daten gefüllt wurde? Weil nein, das ist nicht der Fall. Es könnte z.B. sein, dass die create_thread-Funktion ausgeführt wird, der neue Thread gestartet wird aber noch keine Prozessorlaufzeit bekommt und deine foo-Funktion fortfährt; dann wäre der Inhalt von p unverändert.</p>
<p>Ich denke du hast zwei Möglichkeiten: Entweder du machst dir eine bool-Variable in DATA rein. Die setzt du in der EntryPoint-Funktion, <em>nachdem</em> du den Rest von DATA gefüllt hast.<br />
Oder du machst folgendes:</p>
<pre><code class="language-cpp">struct ThreadParameterData
{
    DATA* p;
    bool init;
};

void foo(){

   DATA *p= IRGENDWAS;
   ThreadParameterData* d = new ThreadParameterData;
   d-&gt;p = p;
   d-&gt;init = false;
   int code = thread_create(Thread::EntryPoint, (void*) ThreadParameterData, &amp; ThreadId_);
   while ( ! d-&gt;init )
       ;
   //(A)
};

void * EntryPoint(void * pthis){

    ThreadParameterData* pd = (ThreadParameterData*)pthis;
    // pd-&gt;p füllen
    pd-&gt;init = true;

  //(B)

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1364391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364391</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 13 Sep 2007 05:50:15 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Thread aufruf? on Thu, 13 Sep 2007 05:57:38 GMT]]></title><description><![CDATA[<p>@hallobalusa: ne p ist keine lokale kopie..</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13210">@badestrand</a>: hallabusa sagt das eine kope des pointer aufm stack gespeicehrt wird, d.h. wenn der theadentry funktion noch nicht gestartet werden kann, ist ja diekopie trozdem noch da oder irre ich mich... Aber trozdem eine gute idee deine möglichkeit;)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364394</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 13 Sep 2007 05:57:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Thread aufruf? on Thu, 13 Sep 2007 06:03:19 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">while ( ! d-&gt;init )
       ;
</code></pre>
<p>Na, sowas macht man aber besser mit einer Condition als mit einem Busy-Loop, oder? <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>
<p>@Boris:<br />
Ich glaube (glaube, weil ich nicht ganz sicher bin dass wir dasselbe verstehen was Du meinst) das eine hat mit dem anderen wenig zu tun. In dem Moment, wo Du create_thread aufrufst, wird das Argument auf den Stack dieser Funktion kopiert, welche den Thread startet und in dem Thread die Funktion (wieder mit dem Argument auf dem Stack) durchläuft. Das ist bis hierhin noch &quot;normales C(++)&quot; - bei der Betrachtung von Lebenszeiten wird jetzt wichtig, worauf ein dort übergebener Zeiger zeigt, nicht der Zeiger selbst.</p>
<p>Badestrand wollte Dir glaube ich nur eine Möglichkeit aufzeigen, wie man von der Thread-Funktion aus an den Thread-Ersteller eine Nachricht schicken kann (wobei man das imho lieber über Conditions lösen sollte).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364400</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 13 Sep 2007 06:03:19 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Thread aufruf? on Thu, 13 Sep 2007 06:10:04 GMT]]></title><description><![CDATA[<p>Oh ja, ich glaub ich hab die Frage falsch verstanden.. Ich dachte, Funktion A solle weitermachen, wenn B die Daten befüllt hat. Naja, egal.</p>
<p>Was ich eigentlich wollte:<br />
Mylord, was meint Er mit Conditions?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364401</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 13 Sep 2007 06:10:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Thread aufruf? on Thu, 13 Sep 2007 06:17:52 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Was ich eigentlich wollte:<br />
Mylord, was meint Er mit Conditions?</p>
</blockquote>
<p>Conditions ist ein Threadkontrollmechanismus, der bedingtes Warten ermöglicht. Kurz und bündig (es steckt mehr dahinter, aber das würde zu weit führen) kannst Du damit in Verbindung mit einem Mutex einen oder mehrere Threads in einen Wartezustand schicken, bis ein anderer Threads ihn/sie wieder aufweckt. In Deinem Beispiel sähe das etwa wie folgt aus (Achtung Pseudocode):</p>
<pre><code class="language-cpp">void foo(){
   Condition cond;

   cond.lock();
   int code = thread_create(Thread::EntryPoint, (void*) &amp;cond, &amp; ThreadId_);
   cond.unlockAndWait();
   //(A)
};

void * EntryPoint(void * pthis) {
    Condition* cond = (Condition*) pthis;

    cond-&gt;lock();
    // mache was, worauf (A) warten muss
    cond-&gt;wake_up();
    cond-&gt;unlock();
    //(B)
    cond = 0; // FESTLEGUNG: nachdem der Erzeuger aufgeweckt wurde, verschwindet cond aus dem Leben (lokale Variable in (A)) und darf hier nicht mehr benutzt werden!
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1364403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364403</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 13 Sep 2007 06:17:52 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Thread aufruf? on Thu, 13 Sep 2007 07:07:05 GMT]]></title><description><![CDATA[<p>ja gut..</p>
<p>(1) in funktion foo() zeigt p auf ein Objekt im speicher</p>
<p>(2) bei createthread wird eine kopie des zeigers im stack erstellt.</p>
<p>(3) foo wird beendet, aber die kopie im stack von createtrhead ist noch da!</p>
<p>d.h. die entrytrhread funktion hat aufjedenfall einen zeiger auf das objket, obwohl foo schon beendet wurde..</p>
<p>oder seh ich das falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364416</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 13 Sep 2007 07:07:05 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Thread aufruf? on Thu, 13 Sep 2007 07:20:09 GMT]]></title><description><![CDATA[<p>Das siehst Du vollkommen richtig. Allerdings vermute ich Deine Schlussfolgerung ist falsch (was sich aber nicht verifizieren lässt, da Du diese nicht mitteilst <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/1364424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364424</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 13 Sep 2007 07:20:09 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Thread aufruf? on Thu, 13 Sep 2007 07:26:36 GMT]]></title><description><![CDATA[<p>meine schlussfolgerung, ich brauch keien conditions, weil der trhead auf jedefall nen gültigen zeiger auf das objekt hat</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364426</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 13 Sep 2007 07:26:36 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Thread aufruf? on Thu, 13 Sep 2007 07:32:55 GMT]]></title><description><![CDATA[<p>Ok, dann war meine Vermutung inkorrekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364430</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 13 Sep 2007 07:32:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Thread aufruf? on Thu, 13 Sep 2007 07:49:52 GMT]]></title><description><![CDATA[<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p>ja gut..</p>
<p>(1) in funktion foo() zeigt p auf ein Objekt im speicher</p>
<p>(2) bei createthread wird eine kopie des zeigers im stack erstellt.</p>
<p>(3) foo wird beendet, aber die kopie im stack von createtrhead ist noch da!</p>
<p>d.h. die entrytrhread funktion hat aufjedenfall einen zeiger auf das objket, obwohl foo schon beendet wurde..</p>
<p>oder seh ich das falsch?</p>
</blockquote>
<p>(3) Stimmt nicht ganz. Die Kopie liegt nicht mehr auf dem Stack, sondern irgendwo wo sie von thread_create gespeichert wurde. Der Stack wird ja nach dem Beenden der Funktion wieder abgeräumt. Du brauchst aber keine Conditions, weil du ja keinen Pointer oder Referenz auf p übergibst, sondern der Wert kopiert wird. Du könntest sogar garnichts machen, weil die Lebenszeit von p garnichts mit der von der Kopie, die beim Funktionsaufruf erzeugt, wird zu tun hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364440</guid><dc:creator><![CDATA[hallobalusa]]></dc:creator><pubDate>Thu, 13 Sep 2007 07:49:52 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Thread aufruf? on Thu, 13 Sep 2007 07:52:59 GMT]]></title><description><![CDATA[<p>hallobalusa schrieb:</p>
<blockquote>
<p>(3) Stimmt nicht ganz. Die Kopie liegt nicht mehr auf dem Stack, sondern irgendwo wo sie von thread_create gespeichert wurde.</p>
</blockquote>
<p>Stimmt auch nicht ganz, die Parameter der Funktion EntryPoint liegen natürlich auch wieder auf dem Callstack, nur dass dieser der Stack des neuen Threads ist (den meinte ich zuvor auch) und nicht der Stack des Erzeugers.</p>
<p>EDIT: Ok, rein technisch stimmt der Satz, da der Stack des neuen Thread auch &quot;irgendwo&quot; liegt <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/1364442</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364442</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 13 Sep 2007 07:52:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Thread aufruf? on Thu, 13 Sep 2007 07:56:57 GMT]]></title><description><![CDATA[<p>ok Jungs... also muss ich jetzt ne condition einbauen oder net??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364448</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 13 Sep 2007 07:56:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Thread aufruf? on Thu, 13 Sep 2007 08:02:15 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>hallobalusa schrieb:</p>
<blockquote>
<p>(3) Stimmt nicht ganz. Die Kopie liegt nicht mehr auf dem Stack, sondern irgendwo wo sie von thread_create gespeichert wurde.</p>
</blockquote>
<p>Stimmt auch nicht ganz, die Parameter der Funktion EntryPoint liegen natürlich auch wieder auf dem Callstack, nur dass dieser der Stack des neuen Threads ist (den meinte ich zuvor auch) und nicht der Stack des Erzeugers.</p>
<p>EDIT: Ok, rein technisch stimmt der Satz, da der Stack des neuen Thread auch &quot;irgendwo&quot; liegt <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>Genau deshalb hab ich irgendwo geschrieben. Es muss aber auch nicht der Callstack von EntryPoint sein. thread_create kann ja schon wieder beendet sein, vor der andere Thread gestartet wurde. Der Wert könnte irgendwo im Stack oder Heap des Schedulers oder sonst wo sein. Keine Ahnung was das OS da genau macht.</p>
<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p>ok Jungs... also muss ich jetzt ne condition einbauen oder net??</p>
</blockquote>
<p>nein, nicht für p.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364451</guid><dc:creator><![CDATA[hallobalusa]]></dc:creator><pubDate>Thu, 13 Sep 2007 08:02:15 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Thread aufruf? on Thu, 13 Sep 2007 08:03:53 GMT]]></title><description><![CDATA[<p>d.h. ich habe auf jedefnall ne gültigen zeiger im thread unabhängig wann der thread zum ersteln mal gestartet wird</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364453</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 13 Sep 2007 08:03:53 GMT</pubDate></item></channel></rss>