2016-12-01 1 views
1

저는 C 및 Linux에서 매우 새롭고 영어는 제 모국어가 아닙니다. 죄송합니다.thread_create 함수 구현 및 테스트

스레드 API를 구현하는 학교 프로젝트에서 작업하고 있으며 clone()을 사용하여 thread_create() 함수를 만들었습니다. 문제는 thread_create(&tid1, NULL, (void *)Testcase1, 0);으로 전화하면 새 스레드가 만들어 지지만 TestCase1에도 thread_create가 포함되어있어 다른 스레드가 생성되지 않는 것입니다. 저 아래에있는 내 코드와 함께 설명 보자

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; 
} 

그리고이 아래에있는 내 테스트 코드입니다 :

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

TestCase1() 아래 :

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 ; 
} 

"Tc1ThreadProc: my thread id (%d), arg is (%d)\n" 3 회를 인쇄하기로했다지만 그것은 단지 때문에 foo()에 대한 호출입니다 "Hii" 인쇄합니다. 어떻게 해결할 수 있습니까?

+0

두 가지 문제가 있습니다. 'thread_create' 함수는 포인터를 함수에 대한 포인터로 만들고 싶습니다. 스레드 기능은'Tc1ThreadProc'가 인수로'int','는 sizeof (int)를''를 sizeof 다를 수 있습니다 소요 (무효 *)'* 정의되지 않은 동작으로 이어지는; 당신의'thread_create' 함수는 여러분이 전달한 함수가 아니라'foo'를 호출하기 위해 하드 코드되어 있습니다; 당신은'thread' 인자를 초기화하지 않습니다; 그리고 마지막으로 생성 함수에서 스택을 해제하십시오. 따라서 스레드에는 스택이 없습니다. –

+0

그러면 foo() 대신에 어떤 함수를 호출해야합니까? 은'clone'를 들어 – user19283043

+0

@Someprogrammerdude는 thread_create''에 전달 된 함수에 대한 포인터를 전달해야 호출합니다. –

답변

1

당신은 인수로를 "thread_create"을 "TestCase1"를 작동하려면 포인터를 전달하지만, 내부 "thread_create는"당신은 전혀 사용하지 않는 : 당신은에서만 "클론"콜을 호출하고

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

"foo"함수에 대한 포인터. "thread_create"내부에서 "TestCase1"포인터의 이름이 "start_routine"이므로 비슷한 "clone"시스템 호출을 호출해야하지만 "foo"에 대한 포인터 대신 "TestCase1"에 대한 포인터를 전달해야합니다. 다음과 같은 것 :

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

완전히 이해했습니다! 고마워요! – user19283043

+0

그리고 부모 프로세스의 SIGCHLD 루틴에서 종료 될 때 자식 프로세스의 스택 메모리를 해제해야합니다. –

+0

그러면 thread_create() 끝에서 스택 메모리를 해제해야합니까? – user19283043