Wie kann man warten, bis die Threads ihre Arbeit beendet haben, wobei Threads von Clone in c erstellt wurden?

Ich versuche die Hauptfunktion abzuwarten, bis die Threads ihre Arbeit beendet haben. Aber die Hauptfunktion beendet ihre Arbeit und beendet sich. Ich denke deswegen hat der Thread nicht die richtigen Zeiger / Werte in den Variablen. (Tally und Schritte)

Weiß jemand, wie man waitpid benutzt / in diesem Fall richtig wartet?

mein Code:

#define _GNU_SOURCE
#include <stdio.h>
#include <inttypes.h> /* for PRIu64 and uint64_t */
/* you'll need further includes */
#include <sched.h>
#include <stdlib.h>
#include "tally.h"
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

#define STACK_SIZE 32768
#define THREADS 2
struct clone_args{
        uint64_t steps;
        uint64_t* tally;

};
int incHelper(void* arg){
        struct clone_args *args = (struct clone_args*)arg;
        uint64_t steps= args->steps;
        uint64_t* tally = args->tally;
        increment(tally,steps);
        (void) arg;
        (void) tally;
        (void) steps;
        exit(2);
        return 0;
}

int main ()
{
        uint64_t N = 10000000;
        uint64_t tally = 1;
        tally_init();
        int thread_pid[THREADS];
        int status;
        for(int i= 0; i<THREADS;i++){
                void *child_stack = malloc(STACK_SIZE);
                struct clone_args *arguments = malloc(sizeof(struct clone_args));
                arguments->steps = N;
                arguments->tally = &tally;
                void* arg = (void*) &arguments;
                thread_pid[i] = clone(incHelper, child_stack+STACK_SIZE,CLONE_VM, arg);
                pid_t pid = waitpid(thread_pid[i],&status,SIGCHLD);
                printf("C-PID [%d]\n", thread_pid[i]);
                (void) pid;
        }

        tally_clean();
        printf( "\nTally is %" PRIu64 "\n", tally );
        (void) N;
        (void) thread_pid;
        (void) tally;
        (void) status;
        printf("\n MAIN PROGRAMM END\n");
        return 0;
}

Die Inkrementfunktion:

/* modify this function to achieve correct parallel incrementation */
void  increment ( uint64_t *tally, uint64_t steps )
{
        printf("\nTALLY: %"PRIu64"\n",*tally);
        printf("STEPS: %"PRIu64"\n",steps);
        for( uint64_t i = 0; i < steps; i++ )
        {
                *tally += 1;
        }
        return;

}

Das Ergebnis habe ich nach dem Ausführen des Codes erhalten:

C-PID [29819]
C-PID [29820]

Tally is 1

 MAIN PROGRAMM END
root@...(~/Downloads/asst3/asst3-clone)$
TALLY: 0
STEPS: 140714329004032

TALLY: 888309
STEPS: 140714329004032

Der Code sollte eine Variable mit zwei Threads erhöhen. Um kritische Abschnitte zu vermeiden, sollte ich Semaphore verwenden. Aber das ist eine andere Übung. Führen Sie zunächst die Übung aus, um mithilfe der Funktion clone () zwei Threads zu erstellen. Ich verstehe nicht, ob die Flags von clone () falsch sind oder mein Code völlig falsch ist. Ich bin neu in Programmiersprache C.

Ich habe die letzten 12 Stunden mit Google gesucht.

Ich danke für jede Antwort :).

Entschuldige mein schlechtes Englisch.

Grüße

Antworten auf die Frage(1)

Ihre Antwort auf die Frage