Frage zu output von code
-
Hallo,
ich habe folgenden Code von einer Tutorial-Seite kopiert und leicht verändert:
#include<stdio.h> #include<string.h> #include<pthread.h> #include<stdlib.h> #include<unistd.h> #include <iostream> pthread_t tid[2]; int counter; using std::cout; using std::endl; void* doSomeThing(void *arg) { for (int i = 0; i <= 1000; ++i) { cout << i << endl; } return NULL; } int main(void) { int i = 0; int err; while(i < 2) { cout << "while" << endl; err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL); if (err != 0) printf("\ncan't create thread :[%s]", strerror(err)); i++; } err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL); cout << err << endl; return 0; }
Kann mir jemand erklären, warum ich hier immer komplett undefinierten output bekomme?
zB:
while while 0
while while 0 1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 032 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 0 1 2 3 4 5 6 7 8 8 9 102 11 1112 13 Process finished with exit code 0
Und so weiter... -.-
Checks grad echt nicht... ^^
Danke & Lg
buzzzz
-
Da laufen halt 2 Threads. Was an dem Output überrascht Dich?
-
Dass er einmal nach 3 zeilen aus ist und dass die Threads nicht bis 1000 zählen.
-
Du wartest halt nicht, daher ist das Program beendet (und damit auch alle Threads) sobald die main-Funktion beendet ist.
-
ah ok... dh das programm kann sich "vor" den threads beenden? Ich dachte, es wartet schon bis die threads abgearbeitet sind...
-
Dann gäbe es aber viele "Leichen"-Prozesse, da oftmals Threads als Endlosschleifen laufen...
-
oh alles klar, danke Th69!
-
buzz_lightzyearGMX schrieb:
ah ok... dh das programm kann sich "vor" den threads beenden? Ich dachte, es wartet schon bis die threads abgearbeitet sind...
die threads sind teile eines prozesses. das unterscheidet sie eben von prozessen.
-
hallo!
ich habe eine datenstruktur mit volatile-zeiger die auf mittels mmap eingebundennen speicher verweisen sollen; quasi
struct RegisterStruct { uint32_t *ledregister; uint32_t *moderegister; uint32_t *frequencyregister; uint32_t *amplituderegister; volatile uint32_t *channel1iregister; volatile uint32_t *channel1qregister; volatile uint32_t *channel2iregister; volatile uint32_t *channel2qregister; int memfd; int intfd; };
funktioniert auch alles scheinbar.
an anderer stelle möchte ich den speicher dann wieder aus dem programm entfernen, also u.a.
rc = munmap(rs->channel1iregister, sysconf(_SC_PAGESIZE));
woraufhin mir der compiler dann folgende warnung (bzw. für die anderen pointer eben auch) ausgibt:
/usr/include/arm-linux-gnueabihf/sys/mman.h:76:12: note: expected ‘void *’ but argument is of type ‘volatile uint32_t * {aka volatile unsigned int *}’
extern int munmap (void *__addr, size_t __len) __THROW;frage: kann ich das einfach casten, muss ich da eine andere funktion nehmen, soll ich die warnungen einfach ignorieren?
-
das sollte hier nicht rein, bitte löschen!