Erstellen von mehreren threads und aufrufen von anderen exectuables in Cygwin durch system()?
Arbeite ich an einem Projekt in Cygwin. In einem Versuch zu erstellen, die mehrere threads in C, und jeder thread ruft eine andere ausführbare Datei über die Kommandozeile mit dem system () - Funktion, es stellt sich heraus Dinge, die nicht richtig funktionieren. Insbesondere ist der code, den ich habe, ist wie dieses:
#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS 5
void *PrintHello(void *threadid)
{
long tid;
tid = (long)threadid;
system("date ");
pthread_exit(NULL);
}
int main (int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc;
long t;
for(t=0; t<NUM_THREADS; t++){
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
pthread_exit(NULL);
}
Aber es funktioniert nicht. Der Fehler den ich bekomme, ist segmenetation Fehler mit stack-überlauf. Trotzdem eine Idee hat, wie andere ausführbare Dateien im system-shell, die parallel durch die Erstellung mehrerer threads?
Danke.
- Es ist offensichtlich nichts falsch mit dem code und es läuft wunderbar unter linux. Wie ein Schuss im Dunkeln, hast du den link mit -pthreads-lpthreads, etc.?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fügen Sie diesen code :
bevor
als in
main()
.Mehrere bugs hier:
In der main () - Funktion, nachdem Sie das erstellen der Threads, die Sie verwenden sollten, pthread_exit() zum beenden der einzelnen Threads. Also, exit() verwenden, ist hier nicht richtig.
Ende der main () - Funktion, kurz bevor Sie kündigen den main-thread, Anruf pthread_join() warten, bis alle einzelnen thread zu beenden.
Am Ende, nachdem alle child-threads beendet haben, können Sie den Aufruf von exit() beendet den Prozess selbst.
http://www.thegeekstuff.com/2012/04/terminate-c-thread/
Dass Problem sieht lohnt sich die Berichterstattung an die Cygwin-Mailingliste.
Was Sie tun können, stattdessen ist zu tun, Weg mit threads und verwenden fork()/exec() oder spawn(_P_NOWAITO, ...) zur Erstellung der child-Prozesse.
(spawn() ist eigentlich eine Familie von Funktionen; siehe /usr/include/Prozess.h für details. Seine Verwendung wird empfohlen, da es vermeidet Cygwin hohe Gabel overhead.)