PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu threads



mithras
11-09-2002, 11:05
Hi,

will mit unteren Code genau 20 Threads erstellen. Meine Frage ist das so korrekt?
Außerdem um zu kontrollieren ob alles passt, übergebe ich die Thread-ID, also &t[i]. Diese lasse ich dann bei jedem Thread ausgeben.
Wie sollte denn eine Thread-ID aussehen, bei mir kommen wenn ich den unteren Code ausführe ziemlich komische Zahlen, zwei Nullen und ziemlich lange positive Zahlen.
Außerdem führt jeder einzelne thread die Fkt. sleep und puts nicht aus, es wird nur der Text hinter printf ausgegebn.




#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

int empfangen(int *wert);

int main(void)
{


int i;
pthread_t t[20];



for(i=0; i<20; i++)
{
if(pthread_create(&t[i], NULL, (void *)&empfangen, (int*)&t[i]) != 0) // Es wird neuer Thread aufgemacht,
{ // sodass der Server als eigener Thread erhalten bleibt!
fprintf(stderr, "Fehler bei Thread ......\n");
exit(0);
}
}


pthread_join(t[20],NULL);

return 0;
}







int empfangen(int *wert)
{

printf("\nIch bin %d\n", *wert);
sleep(2);
puts("blsbls");

sleep(1);

return 0;
}

Mattburger
11-09-2002, 12:45
Hi mithras


die start_routine solle besser mit void angegeben sein.


void empfangen(int *wert)


in der empfangen- routine wurde ich dann noch einen
pthread_exit( (void *)NULL);

einbauen.

Grüße
Mike

mithras
11-09-2002, 13:31
hallo ok ich lasse durch die schleife mit dem array mehrere threads erzeugen.
ich hab nun auch den code eingebaut, dass der thread wieder beendet wird, leider funktioniert das aber nicht.
Obwohl ich den besagr code eingebaut habe, werden immer mehr threads erstellt (wenn die for-schleife) öfter durchlaufen wird, ohne dass einer beendet wird!

was kann ich tun ?

anda_skoa
11-09-2002, 14:04
Original geschrieben von mithras
Außerdem führt jeder einzelne thread die Fkt. sleep und puts nicht aus, es wird nur der Text hinter printf ausgegebn.


Eventuell liegt das an puts, oder daran, dass du kein \n im String hast.
stdout ist normalerweise gepuffert, d.h. es wird nur ausgegeben, wenn es geflushed wird, oder, soweit ich weiß, wenn ein newline kommt.

Vielleicht sollte man auch printf und puts zusammen benutzen.

Ciao,
_

mithras
11-09-2002, 14:13
jo die sache hat sich erledigt (mit dem printf und puts) mein jetziges problem ist, dass ich mit einer schleife so an die 30 threads erzeugen lasse, das problem aber habe, dass es über 3 min dauert bis die sich wieder beenden.
da ich immer wieder neue threads starte werden das nach kurzer zeit 10000 threads....

Mattburger
11-09-2002, 15:25
Hi

bei nochmaligem Betrachten viel mir auf, das beim join das array mit den threads übergeben wird.
Hier ist natuerlich eine Schleife und ein warten auf alle threads notwendig.

Alternativ kannst du natürlich den thread auch detachen:
pthread_detach().

Ich glaub das ist auch was du eigentlich möchtest.

Grüße

Mike

anda_skoa
11-09-2002, 15:33
Oder du legst ein zweites Array an, in dass du vor dem start einen Wert != 0 einträgst und der Thread setzt es auf 0 zurück.
Dann startest du in der Schleife nur die Threads, an deren Position 0 im Array steht.

Allerdings, wie immer wenn man mit Threads auf gemeinsame Datenstrukturen zugeift, sollte man sich über Locking, etc Gedanken machen.

ciao,
_

mithras
11-09-2002, 16:54
Mit unteren code erstelle ich 20 Threads, in der Funktion cache (die ja parallel zugleich von allen 20 threads ausgeführt wird) schließe ich die threads wieder mit
pthread_exit( (void *)NULL);
man beachte dass ich die threads sogar detached wie Mattburger mir empfohlen hat erstelle, aber trotzdem dauert es ewig! über 3 min. bis die threads wieder beendet werden!

Wie kann ich sie gleich direkt nachdem die funktion beendet ist wieder schließen.
Schließlich wird der untere code öfters hintereinander ausgeführt, sodass sich nahezu unendlich viele threads bilden würden, wenn sie nicht sofort nach der Ausführung beendet werden!




pthread_t t[20];
pthread_attr_t attr;

for(ptr->i=0; ptr->i<20; ptr->i++ ) geschickt!
{


pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);



if(pthread_create(&t[ptr->i], &attr, (void *)&cache, NULL) != 0)
{
fprintf(stderr, "Fehler bei Thread ......\n");
exit(0);
}