Frage von ZrioXoirZ, 45

C++ 2 whille loops parallel laufen lassen?

Hallo liebe Community,

Ich wollte fragen wie es möglich sein aus der main() 2 weitere while loops zu starten die Parallel laufen. Jedoch soll die main() weiter laufen also 3 threads sollen Parallel laufen.

Antwort
von tgel79, 17

Mit C++11 sollte das kein Problem sein. Alternativ kannst du natürlich Boost.thread benutzen. (oder OpenMP)

Sollen die While Schleifen unterschiedliche Dinge erledigen? Hier mal ein ganz einfaches C++11 Beispiel (modulo Syntaxfehlern):

Das kann man natürlich alles noch etwas besser machen ... insbesondere, wenn die While-Schleifen der gleiche Code ist.

#include <iostream>
#include <thread>
// Diese Funktion wird von den Threads aufgerufen
void
call_thread_while1() {
// diese While-Schleife ist natürlich quatsch
// und dient nur der Erläuterung
while(true) {
break;
}
}

void
call_thread_while2() {
// diese zweite While-Schleife ist natürlich
// auch quatsch
while(true) {
break;
}
}

int
main(char **argv, int argc) {
// thread starten
std::thread t1(call_from_thread_while1);
std::thread t2(call_from_thread_while2);

// Warten auf synchronisation
t1.join();
t2.join();
return 0;
}
Kommentar von ZrioXoirZ ,

Aber hier ist doch das Problem das meine main void so zu sagen nicht weiter läuft bis die beiden Threads fertig sind

Kommentar von tgel79 ,

Naja, wichtig ist eigentlich nur, dass du alle threads am Ende des Programms "joinst". Du kannst so viel du willst in der main-Routine zwischendurch ausführen.

Die beiden while schleifen werden als Thread gestartet und deine main-Routine läuft bis zum join, also bis zum Ende des Programms.

Möchtest du, dass sich das Programm vom Terminal detached und im Hintergrund weiterläuft? Das erreichst du aber nicht, wenn du das join weglässt ;)

Kommentar von ZrioXoirZ ,

Der punkt ist habe in meiner void die in aufrufe also in deinem beispiel main ohne () am ende dann läd er die infinite while net also die werden gar nicht erst gestartet

Kommentar von tgel79 ,

Was für ein Compiler  ?

Also, hier mal ein echtes kompilierbares Beispiel:

g++-4.9 -std=c++11 -pthread test3.cpp -o test3

(Beispiel hat auch mit dem 5.3er funktioniert.

Output ist etwas durcheinander :

~$ ./test3
echo thread2 echo thread1 100

echo thread2 1
echo thread2 2
echo thread2 3
echo thread2 4
echo thread1 9
echo thread1 8
echo thread1 7
echo thread1 6

Code ist:

#include <iostream>
#include <thread>
// Diese Funktion wird von den Threads aufgerufen
void
call_thread_while1() {
// diese While-Schleife ist natürlich quatsch
// und dient nur der Erläuterung
int i =10 ;
while( i > 5) {
std::cout << "echo thread1 " << i << std::endl;
i--;
}
}

void
call_thread_while2() {
// diese zweite While-Schleife ist natürlich
// auch quatsch
int i =0 ;
while( i < 5) {
std::cout << "echo thread2 " << i << std::endl;
i++;
}
}

int
main(int argc, char** argv) {
// thread starten
std::thread t1(call_thread_while1);
std::thread t2(call_thread_while2);

// Warten auf synchronisation
t1.join();
t2.join();
return 0;
}
Kommentar von ZrioXoirZ ,

Also Ich schreibe zurzeit ein Singplayer Menu in GTA 5 hier mein Code der leider nicht ausgeführt wird

void MAIN_MAIN()
{
while (TRUE)
{
DRAW und und und..... KEIN BREAK drinnen soll unendlich lang laufen :D
}
}

int THREAD(int argc,char** argv)
{
std::thread THREAD_1(MAIN_MAIN)

THREAD_1.join();
}

void MAIN() <- wird von ScriptHook gestartet
{

THREAD;

}

Kommentar von tgel79 ,

Ich bin kein GTA-Experte, aber wenn es als Bilbliothek innerhalb von GTA läuft, dann kann es auch noch weitere restriktionen geben.

Du kannt ja mal in entsprechenden Foren nachfragen, wie

http://www.nextgenupdate.com/forums/gta-5-coding/

Für mich sieht das ordentlich aus.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten