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?
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. –
dann welche Funktion muss ich anstelle von foo() aufrufen? @Someprogrammerdude – user19283043
Für den 'Klon' Aufruf sollten Sie den Zeiger auf die Funktion übergeben, die an' thread_create' übergeben wurde. –