2016-12-01 1 views
1

Ich bin sehr neu in C und Linux und Englisch ist nicht meine Muttersprache. Entschuldigung im Voraus.Implementieren und Testen thread_create Funktion

Ich arbeite an einem Schulprojekt, das Thread API implementiert, und ich habe die Funktion thread_create() mit clone() erstellt. Das Problem ist, dass wenn ich rufe thread_create(&tid1, NULL, (void *)Testcase1, 0);, es erstellt einen neuen Thread aber TestCase1 enthält auch thread_create und es scheint nicht erstellen einen anderen Thread. Lassen Sie mich unten mit meinem Code erklären:

int foo(void* arg){ 
    printf("Hii"); 
    return 0; 
} 
int  thread_create(thread_t *thread, thread_attr_t *attr, void *(*start_routine) (void *), void *arg) 
{ 
    void* stack; 

    stack= malloc(STACK_SIZE); 
    pid_t pid; 

    if(stack==0) 
    { 
     perror("malloc : could not allocate stack"); 
     exit(1); 
    } 
    pid = clone(&foo ,(char*)stack+STACK_SIZE,SIGCHLD|CLONE_VM|CLONE_SIGHAND|CLONE_FS|CLONE_FILES,0); 
    if(pid == -1) 
    { 
     perror("clone"); 
     exit(2); 
    } 
    kill(pid, SIGSTOP); 

    Thread* newTCB = (Thread*)malloc(sizeof(Thread)); 
    newTCB->stackSize = malloc(STACK_SIZE); 
    newTCB->pid = pid; 
    newTCB->status = THREAD_STATUS_READY; 

    rEnqueue(newTCB); 
    rPrintqueue(); 

    free(stack); 
    printf("Child thread returned and stack freed.\n"); 
    return 0; 
} 

Und das ist mein Testcode unter:

thread_create(&tid1, NULL, (void*)TestCase1, 0); 

TestCase1() unter:

int Tc1ThreadProc(int param) 
{ 
    int tid = 0; 
    int count = 0; 

    tid = thread_self(); 

    count = 3; 
    while (count > 0) 
    { 
     /* sleep for 1 seconds */ 
     sleep(2); 
     printf("Tc1ThreadProc: my thread id (%d), arg is (%d)\n", tid, param); 
     count--; 
    } 
} 
void TestCase1(void) 
{ 
    thread_t tid[TOTAL_THREAD_NUM]; 

    thread_create(&tid[0], NULL, (void*)Tc1ThreadProc, (int*)1); 
    thread_create(&tid[1], NULL, (void*)Tc1ThreadProc, (int*)2); 
    thread_create(&tid[2], NULL, (void*)Tc1ThreadProc, (int*)3); 

    while(1){} 

    return ; 
} 

es angenommen hat "Tc1ThreadProc: my thread id (%d), arg is (%d)\n" 3 mal drucken, aber Es druckt nur "Hii", die wegen des Anrufs foo() ist. Wie behebe ich das?

+0

Ein paar Probleme: Ihre 'thread_create' Funktion will einen Zeiger * auf einen Zeiger * zu einer Funktion; Ihre Thread-Funktion 'Tc1ThreadProc' nimmt ein' int' als Argument, wenn 'sizeof (int)' von 'sizeof (void *)' abweichen kann, was zu * undefiniertem Verhalten führt; Ihre 'thread_create' Funktion ist hardcodiert, um' foo' aufzurufen und nicht die Funktion, die Sie übergeben; Sie initialisieren das 'thread' Argument nicht; Und zuletzt befreit Ihr den Stapel in der Erstellungsfunktion, damit die Threads keinen Stack haben. –

+0

dann welche Funktion muss ich anstelle von foo() aufrufen? @Someprogrammerdude – user19283043

+0

Für den 'Klon' Aufruf sollten Sie den Zeiger auf die Funktion übergeben, die an' thread_create' übergeben wurde. –

Antwort

1

Sie Zeiger übergeben „TestCase1“ als Argument zu funktionieren „thread_create“, aber innen „thread_create“ Sie tun es nicht benutzen:

thread_create(&tid1, NULL, (void*)TestCase1, 0); 

Sie sind nur „Klon“ syscall Aufruf mit Zeiger auf "foo" -Funktion. Von innen "thread_create" Ihr "TestCase1" Zeiger heißt "start_routine", so dass Sie ähnliche "Klon" Syscall aufrufen müssen, aber stattdessen Zeiger auf "foo" sollten Sie übergeben Zeiger auf "TestCase1". So etwas wie das:

pid = clone(start_routine, (char*) stack + STACK_SIZE, SIGCHLD | CLONE_VM | CLONE_SIGHAND | CLONE_FS | CLONE_FILES, 0); 
+0

Völlig verstanden! Danke vielmals! – user19283043

+0

Und Sie sollten Speicher des Kindprozesses frei stapeln, wenn es fertig ist, normalerweise bei SIGCHLD-Routine im Elternprozess. –

+0

Dann sollte ich Stapelspeicher am Ende von thread_create() freigeben? – user19283043

Verwandte Themen