Problem bei random-wert,struct, thread
-
output ist defekt.
Und wie sieht die Ausgabe aus Zeile 17 aus?
-
SeppJ schrieb:
Eine Funktion, die wir nicht kennen, in einem Programm, das wir kaum kennen, gibt einen Wert zurück, der dich aus Gründen, die wir nicht kennen, überrascht. Das ist ein bisschen mager, um dir helfen zu können.
Klar aber RandomValue sieht nahezu so aus wie im Kommentarfenster
die funktioniert auch, da ich sie schon getestet haben.
Hier der gesamt Code dazu:
[cpp]int randomValue()
{
time_t timer;
int rand_num;
time(&timer);
srand((int)timer);
rand_num = (rand()%1000);
return(rand_num);
}
Am Besten funzt sie mit einem Sleep(1);Kompilierung funzt fehlerfrei
Auch ohne Warnungen? (Du hast doch brav alle Warnungen aktiviert, oder?)
gcc -Wall -Wextra nehme ich immer.
Hast du was Bessers ? Wäre fein.
naja ich habe es auch so probiert:
//oder auch so probiert //threadparam_t threadpa[input]hat leider auch nicht funktioniert.
Ich wollte nicht den gesamten Code hier hinenstellen, da es keinen
interessiert einige Seiten durchzulesen(glaub ich halt).Aber ich muss sagen der Fehler liegt sicher hier in der Region.
Nur woBin für jede Hilfe dankbar.
-
s.luis schrieb:
gcc -Wall -Wextra nehme ich immer.
Ist ok.
Ich wollte nicht den gesamten Code hier hinenstellen, da es keinen
interessiert einige Seiten durchzulesen(glaub ich halt).Dies ist offensichtlich nicht der Code, denn die Ausgabe die du angibst, passt nicht zur Ausgabe im Code. Wenn du den Code umgeschrieben hast für das Forum, dann hast du eventuell auch den Fehler rausgemacht.
Die Idee ist, dass du alles aus dem Programm hinaus nimmst, das nicht mit dem Fehler zu tun hat. Wenn du dein Programm nur noch ein paar Zeilen hat und den Fehler immer noch zeigt, dann stellst du es hier vor. Und zwar vollständig, so dass wir es compilieren und den Fehler selber sehen können. Wenn beim Zusammenkürzen des Programms plötzlich der Fehler nicht mehr auftritt, dann wirst du in einem der gekürzten Teile irgendwas dummes tun und solltest ihn dir nochmal angucken.
Du benutzt anscheinend ein Linux/Posix. Wenn du einen Fehler durch falsche Initialisierung oder Überschreibung vermutest, dann hilft sehr oft valgrind. Mal mit allen Basistests aufrufen (vorher daran denken mit Debugoptionen (-g) zu compilieren!):
http://cs.ecs.baylor.edu/~donahoo/tools/valgrind/
-
s.luis schrieb:
Aber ich muss sagen der Fehler liegt sicher hier in der Region.
Da bist du nicht der Erste der sich da täuscht. Leider auch nicht der Letzte.
-
Hallo Kollegen,
habe den Fehler gefunden.
Ist zwar nicht die schönste Lösung aber wenn ich
Sleep(1); in die Randomfunktion einbaue dann funktioniert alles super.Scheint mir liefert die random-Funktion nicht schnell genug die Werte für mehrere Threads und deshalb kommen auch komische Dinge heraus.
Wenn ich ein mutex darüberlege geht es auch.
Habe jetzt mein Prg mit 5000-Threads laufen gelassen, war zwar nicht schnell, aber es arbeitet Korrekt.Dankeschön für die Hilfe.
LG
Luis
-
sleep ist einer der dümmsten pseudo Workarounds für eine Race-Condition. Wie kann man mit Threads programmieren wollen ohne die absoluten Grundlagen von Threads zu kennen? Zieh dir unbedingt mal ein Tutorial rein!
-
SeppJ schrieb:
sleep ist einer der dümmsten pseudo Workarounds für eine Race-Condition. Wie kann man mit Threads programmieren wollen ohne die absoluten Grundlagen von Threads zu kennen? Zieh dir unbedingt mal ein Tutorial rein!
Jetzt erkläre mir mal eines SeppJ, wennst du dir den code ansiehst, bekommt jeder
thread bevor er erstellt wird schon seine Zufallszahl zugewiesen. Wie kann es da zu einer race-conditon führen???
die zufallszahl wird dann in einer struct an den output-übergeben.es ist sicher ein timing-problem, jedoch weiss ich nicht warum. sonst hätte ich
hier nicht um rat gefragt, sondern hätte einfach die lösung gepostet.ich kann auch mit joins auf einen thread warten. würde das problem auch lösen, jedoch nicht die ursache.
luis
-
weiters noch: habe genug tutorials schon gelesen, macht aber keinen besseren programmierer, sondern die übung ist es. wie bei einem handwerk.
und beim üben bin ich gerade dabei.
-
aber ich muss Hrn. SeppJ schon recht geben. habe diesbezüglich sicher noch lernbetarf.
habe es bei einem anderen bsp versucht. wieder ein fehler.das pthread_create macht nicht das was es soll, bei mir halt nicht
neues beispiel mit nur einem thread.
der nur eine funktion ausführt und wieder derselbe timing-fehler.
weise vorher die werte zu (mit outputs kontrolliert) und dann übergebe
ich die struct dem pthread_create und ein wert stimmt manchmal nicht.
shit shit
vielleicht habt ihr welche tipps,bbbiiiiittttteeee
-
Hatt SeppJ doch schon geschrieben:
Reduziere deinen Code schrittweise auf das wesentliche. Wenn der Fehler nicht mehr auftaucht, ist er im entfernten Teil.Zeig doch mal deine Funktion
output
. Die rufst du doch mitpthread_create
auf.
-
ich glaube, ich habe es jetzt. der fehler liegt darin, dass ich immer pthread_exit genommen habe, statt pthread_join. somit terminiert der main-thread vorher und wartet nicht auf die anderen threads.
wenn er vorher terminiert, dann ist das ergebnis blödsinn, terminiert er nachher dann stimmt es.
deshalb hat auch der hack mit dem sleep gefunzt.
fixxxxxxmeegehört zwar schon ins unix-forum,aber was soll es.
hat wer ein gutes tutorial für threads, ausgenommen die standard-dinge.
und man-pages die man nur dann versteht wenn man eh schon alles gecheckt hat.
danke+lg luis
-
DirkB schrieb:
Hatt SeppJ doch schon geschrieben:
Reduziere deinen Code schrittweise auf das wesentliche. Wenn der Fehler nicht mehr auftaucht, ist er im entfernten Teil..das war die richtige taktik.
danke
-
s.luis schrieb:
hat wer ein gutes tutorial für threads, ausgenommen die standard-dinge.
join vs. exit ist ein Standardding. Dir fehlen die Grundlagen. Das
solltemuss jedes brauchbare Tutorial behandeln.