C++ 2 whille loops parallel laufen lassen?

1 Antwort

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;
}
ZrioXoirZ 
Fragesteller
 24.05.2016, 10:44

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

0
tgel79  24.05.2016, 10:52
@ZrioXoirZ

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 ;)

1
ZrioXoirZ 
Fragesteller
 24.05.2016, 12:08
@tgel79

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

0
tgel79  24.05.2016, 12:34
@ZrioXoirZ

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;
}
1
ZrioXoirZ 
Fragesteller
 24.05.2016, 12:39
@tgel79

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;

}

0