저는 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"
인쇄합니다. 어떻게 해결할 수 있습니까?
두 가지 문제가 있습니다. 'thread_create' 함수는 포인터를 함수에 대한 포인터로 만들고 싶습니다. 스레드 기능은'Tc1ThreadProc'가 인수로'int','는 sizeof (int)를''를 sizeof 다를 수 있습니다 소요 (무효 *)'* 정의되지 않은 동작으로 이어지는; 당신의'thread_create' 함수는 여러분이 전달한 함수가 아니라'foo'를 호출하기 위해 하드 코드되어 있습니다; 당신은'thread' 인자를 초기화하지 않습니다; 그리고 마지막으로 생성 함수에서 스택을 해제하십시오. 따라서 스레드에는 스택이 없습니다. –
그러면 foo() 대신에 어떤 함수를 호출해야합니까? 은'clone'를 들어 – user19283043
@Someprogrammerdude는 thread_create''에 전달 된 함수에 대한 포인터를 전달해야 호출합니다. –