我是C和Linux的新手,英语不是我的母语。提前道歉。
我正在做一个学校项目,它正在实现线程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);
测试用例1()如下:
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次,但它只打印"Hii"
,这是因为调用了foo()
。我该怎么解决?
最佳答案
将指向函数“testcase1”的指针作为参数传递给“thread_create”,但在“thread_create”中根本不使用它:
thread_create(&tid1, NULL, (void*)TestCase1, 0);
只使用指向“foo”函数的指针调用“clone”syscall。
在“thread_create”中,您的“testcase1”指针被命名为“start_routine”,因此您需要调用类似的“clone”syscall,但是应该将指针传递给“foo”。像这样的:
pid = clone( start_routine, (char*) stack + STACK_SIZE, SIGCHLD | CLONE_VM | CLONE_SIGHAND | CLONE_FS | CLONE_FILES, 0);