<?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[Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen?]]></title><description><![CDATA[<p>Hi Leute,</p>
<p>Mein Problem ist folgendes:<br />
Ich habe eine Thread Funktion,</p>
<pre><code class="language-cpp">DWORD WINAPI MyThreadFunction(PVOID pParam)
{
    std::vector&lt;int&gt; List;

    /* push_back ... */

    pParam = List; // ???
}
</code></pre>
<p>möchte eine Struktur an <em>pParam</em> uebergeben und von der Thread Funktion einen Container vom Typ <em>std::vector</em> erhalten.</p>
<pre><code class="language-cpp">struct MyStructure
{
    int Value1;
    int Value2;
    /* ... */
};

int main(void)
{

    unsigned long id; // Thread identity

    MyStructure Information;

    HANDLE hThread = CreateThread(NULL, 0, &amp;Information, 0, &amp;id);

    return 0;
}
</code></pre>
<p>Wie mache ich das am geschicktesten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/217401/wie-kann-man-mit-quot-createthread-quot-einen-container-austauschen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 06:20:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/217401.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Jul 2008 12:43:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen? on Mon, 07 Jul 2008 12:43:27 GMT]]></title><description><![CDATA[<p>Hi Leute,</p>
<p>Mein Problem ist folgendes:<br />
Ich habe eine Thread Funktion,</p>
<pre><code class="language-cpp">DWORD WINAPI MyThreadFunction(PVOID pParam)
{
    std::vector&lt;int&gt; List;

    /* push_back ... */

    pParam = List; // ???
}
</code></pre>
<p>möchte eine Struktur an <em>pParam</em> uebergeben und von der Thread Funktion einen Container vom Typ <em>std::vector</em> erhalten.</p>
<pre><code class="language-cpp">struct MyStructure
{
    int Value1;
    int Value2;
    /* ... */
};

int main(void)
{

    unsigned long id; // Thread identity

    MyStructure Information;

    HANDLE hThread = CreateThread(NULL, 0, &amp;Information, 0, &amp;id);

    return 0;
}
</code></pre>
<p>Wie mache ich das am geschicktesten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1542597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1542597</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Mon, 07 Jul 2008 12:43:27 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen? on Mon, 07 Jul 2008 17:57:38 GMT]]></title><description><![CDATA[<p>Den Zeiger auf die Struktur bekommst du einfach indem du ihn entsprechend zurückcastest:</p>
<pre><code class="language-cpp">struct Information
{
    int Value1;
    int Value2;
};

DWORD WINAPI MyThreadFunction(PVOID pParam)
{
    Information* info = static_cast&lt;Information*&gt;(pParam);
    // ...
    return 0;
}
</code></pre>
<p>Wie du dann nen std::vector zurückgeben kannst ist IMO naheliegend: pack den vector mit in die Struktur hinein:</p>
<pre><code class="language-cpp">struct Information
{
    int Value1;
    int Value2;
    std::vector&lt;int&gt; Result;
};

DWORD WINAPI MyThreadFunction(PVOID pParam)
{
    Information* info = static_cast&lt;Information*&gt;(pParam);
    // ...
    info-&gt;Result.push_back(...);
    info-&gt;Result.push_back(...);
    info-&gt;Result.push_back(...);
    // ...
    return 0;
}
</code></pre>
<p>Natürlich musst du dafür sorgen dass die struct mindestens solange lebt wie der Thread läuft, sonst kracht es. Sollte das Schwierigkeiten bereiten frag nochmal, gibt's relativ einfache Lösungen die sich eigentlich überall anwenden lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1542933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1542933</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 07 Jul 2008 17:57:38 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen? on Tue, 08 Jul 2008 09:34:05 GMT]]></title><description><![CDATA[<p>Okay danke. Ich versuch's mal so <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>PS: Sollte man Pointer nicht lieber mit <strong>reinterpret_cast</strong> casten? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1543219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1543219</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Tue, 08 Jul 2008 09:34:05 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen? on Tue, 08 Jul 2008 10:50:52 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<blockquote>
<p>PS: Sollte man Pointer nicht lieber mit reinterpret_cast casten?</p>
</blockquote>
<p>Nein, nicht grundsätzlich, <em>reinterpret_cast</em> sollte nur das letzte Mittel sein, um eine &quot;Umwandlung&quot; zu erzwingen. <em>static_cast</em> berücksichtigt jedoch auch, wenn die Binärdarstellung des Zieltypen sich von der des Ausgangstypen unterscheidet und nimmt eine entsprechende Änderung vor. Dass die Binärdarstellungen unterschiedlich sind, muss zwar, je nach System, nicht sein, aber wenn man es auch hier so macht, gewöhnt man sich gleich den &quot;richtigen&quot; Einsatz der cast-Operatoren an und ist auf der &quot;sicheren Seite&quot;.</p>
<p>MfG,</p>
<p>Probe-Nutzer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1543289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1543289</guid><dc:creator><![CDATA[Probe-Nutzer]]></dc:creator><pubDate>Tue, 08 Jul 2008 10:50:52 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen? on Tue, 08 Jul 2008 10:53:38 GMT]]></title><description><![CDATA[<p>Wieso willst du reinterpret_cast verwenden wenn static_cast ausreicht und garantiert das Verhalten liefert was du möchtest?<br />
Bei T* -static-cast-&gt; void* -static-cast-&gt; T* ist laut Standard garantiert dass am Ende das rauskommt mit dem man angefangen hat.<br />
Dass der erste static cast dabei garkeiner war, sondern die implizite Konvertierung von T* nach void* darf dabei IMO keine Rolle spielen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1543295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1543295</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 08 Jul 2008 10:53:38 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen? on Wed, 09 Jul 2008 19:01:18 GMT]]></title><description><![CDATA[<p>Nein, nein, ich wollte mich gar nicht auf <strong>reinterpret_cast</strong> festlegen lassen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
War nur ne Frage außerdem ist so weit ich weiß <strong>static_cast</strong> ein ganz kleines bischen schneller weil es schon beim kompilieren gecastet wird <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/1544532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1544532</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Wed, 09 Jul 2008 19:01:18 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen? on Wed, 09 Jul 2008 22:57:45 GMT]]></title><description><![CDATA[<p>static_cast ist in diesem Fall genauso schnell/langsam wie reinterpret_cast. Beides auf den meisten Plattformen ein NOP.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1544639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1544639</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 09 Jul 2008 22:57:45 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen? on Thu, 10 Jul 2008 11:52:50 GMT]]></title><description><![CDATA[<p>Okay alles klar, danke <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>Aber noch ne kleine Frage:<br />
Ist die ID des Threads wichtig? Ich mach das so, dass ich die 'unsigned long id;' einfach uninitialisiert lasse. Ist das so richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1544955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1544955</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Thu, 10 Jul 2008 11:52:50 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen? on Thu, 10 Jul 2008 20:10:41 GMT]]></title><description><![CDATA[<p>Die ID gibt dir sowieso das OS vor, das ist ein output Parameter.<br />
Von daher kannst du das ruhig uninitialisiert lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1545327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1545327</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 10 Jul 2008 20:10:41 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen? on Fri, 11 Jul 2008 12:34:31 GMT]]></title><description><![CDATA[<p>Achso, deshalb ist dieser Parameter auch eine Referenz <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /><br />
In Ordnung, danke an alle <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/1545684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1545684</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Fri, 11 Jul 2008 12:34:31 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen? on Fri, 11 Jul 2008 19:08:01 GMT]]></title><description><![CDATA[<blockquote>
<p>Referenz</p>
</blockquote>
<p>Eher ein Zeiger <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/1545898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1545898</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 11 Jul 2008 19:08:01 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen? on Sun, 13 Jul 2008 13:21:34 GMT]]></title><description><![CDATA[<p>Mal zum Thema <strong>Thread-sicheres Programmieren unter Windows</strong>:</p>
<p>ich entwickel zur Zeit ein 2D Spiel unter Windows.<br />
Da ich dort für jeden BOT ein Pathfining-System anwende - welches natürlich viel Zeit in Anspruch nimmt (für jeden BOT ca. 0.1 Sekunden) - mache ich das für jeden BOT in einer Thread Funktion.<br />
Diese Thread Funktion läuft dann nur ca. 0.1 Sekunden, bei 100 BOTs laufen dann natürlich 100 Threads aber dafür eben nur sehr kurz.</p>
<p>Was ich wissen möchte ist: was muss man machen (welche Funktionen der WinAPI sind notwendig) um das Programm Thread-sicher zu programmieren?</p>
<p>Momentan stützten bei mir nur die Threads ab aber das Programm selbst läuft noch für ein paar Sekunden weiter. Dann kommt das bekannte &quot;Fehler senden oder nicht senden&quot; und schließlich terminiert Windows meine Anwendung komplett.</p>
<p>Kennt sich jemand mit Thread-Programmierung unter Windows aus?</p>
<p>Mfg Lukas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546633</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Sun, 13 Jul 2008 13:21:34 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen? on Sun, 13 Jul 2008 14:12:03 GMT]]></title><description><![CDATA[<blockquote>
<p>Kennt sich jemand mit Thread-Programmierung unter Windows aus?</p>
</blockquote>
<p>Ja, ich und einige andere.</p>
<blockquote>
<p>was muss man machen (welche Funktionen der WinAPI sind notwendig) um das Programm Thread-sicher zu programmieren?</p>
</blockquote>
<p>Das kann man so nicht sagen.</p>
<p>Du musst erstmal verstehen was Threads eigentlich sind, und warum es zu Problemen kommen kann. Wenn du das mal raus hast kannst du anfangen nach Lösungen zu suchen oder zu fragen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546650</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 13 Jul 2008 14:12:03 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen? on Mon, 14 Jul 2008 07:57:37 GMT]]></title><description><![CDATA[<p>Nagut, dann frag ich einfach mal, ob es zu Fehler kommen kann, wenn ein Thread und das Hauptprogramm gleichzeitig auf eine Variable (z.B. boolean) zugreifen?</p>
<p>Aber eigentlich sollte das ja kein Problem sein, denn einen boolean Variable auf 'true' oder 'false' zu setzten, entspricht doch auch nur einem Assembler Schritt, oder?!</p>
<p>Was für mich aber auch wichtig währe: gibt es eine Funktion um im Hauptprogramm zu prüfen ob der Thread noch läuft oder schon beendet wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546915</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Mon, 14 Jul 2008 07:57:37 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen? on Tue, 15 Jul 2008 10:05:32 GMT]]></title><description><![CDATA[<blockquote>
<p>ob es zu Fehler kommen kann, wenn ein Thread und das Hauptprogramm gleichzeitig auf eine Variable (z.B. boolean) zugreifen?</p>
</blockquote>
<p>Ja kann es.</p>
<blockquote>
<p>Aber eigentlich sollte das ja kein Problem sein, denn einen boolean Variable auf 'true' oder 'false' zu setzten, entspricht doch auch nur einem Assembler Schritt, oder?!</p>
</blockquote>
<p>Wenn dir der Compiler nicht mit irgendwelchen Optimierungen dazwischenpfuscht, und du auf einem x86 System arbeitest, dann geht es normalerweise. Wenn du auf anderen CPUs arbeitest kann es sein dass diverse Änderungen die Thread A macht erst *irgendwann* von Thread B &quot;gesehen&quot; werden. Auch kann es passieren dass Änderungen an z.B. 2 Variablen in der falschen Reihenfolge gesehen werden, also dass zuerst die 2. Änderung sichtbar wird und danach erst die 1. Änderung.</p>
<blockquote>
<p>Was für mich aber auch wichtig währe: gibt es eine Funktion um im Hauptprogramm zu prüfen ob der Thread noch läuft oder schon beendet wurde.</p>
</blockquote>
<p>Unter Windows: WaitForSingleObject() mit einem Timeout von 0. Mit PTHREADS kenne ich mich nicht so wirklich aus, müsste dir ein PTHREADS-Kenner beantworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547563</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 15 Jul 2008 10:05:32 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen? on Tue, 15 Jul 2008 10:42:36 GMT]]></title><description><![CDATA[<p>informier dich mal über thread syncronisation und mutexe;) Es gibt im netz einige Thread Patterns (Active Object) .. hab da mal code gesehen das war einfach und übersichtich...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547581</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Tue, 15 Jul 2008 10:42:36 GMT</pubDate></item><item><title><![CDATA[Reply to Wie kann man mit &amp;quot;CreateThread(...)&amp;quot; einen Container austauschen? on Tue, 15 Jul 2008 11:07:13 GMT]]></title><description><![CDATA[<p>Noch 'ne kleine Anmerkung: Soweit ich weiß verursachen mit &quot;CreateThread&quot; erstellte Threads einen Leak von ~500 Bytes. Nicht tragisch, aber wenn du ständig neue Threads für die Bots erstellst, könnte sich das nach 'ner Zeit stark aufsummieren.<br />
Afaik heißt die Lösung dann &quot;_begin_thread&quot;, weil da noch irgendwas getan wird, hm... was sich meiner Kenntnis entzieht... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>edit: Und sowas wie eine kleine Regel zu gemeinsam von Threads verwendeten Variablen: Wenn alle Threads die gemeinsame Variable lesen ist das kein Problem, sobald mindestens einer schreibt, würde ich das Ganze mit Mutexen absichern. Für einfaches Mutex'ing verwende ich meist sf::Mutex mit sf::Lock aus der SFML-Bibliothek (<a href="http://www.sfml-dev.org/tutorials/1.3/system-threads.php" rel="nofollow">http://www.sfml-dev.org/tutorials/1.3/system-threads.php</a>, siehe weit unten).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547598</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 15 Jul 2008 11:07:13 GMT</pubDate></item></channel></rss>