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!