gpt4 book ai didi

c - 实现和测试 thread_create 函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:44 25 4
gpt4 key购买 nike

我是 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);

下面的 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 次但它只打印 "Hii"这是因为调用了 foo()。我该如何解决这个问题?

最佳答案

您将指向函数“TestCase1”的指针作为参数传递给“thread_create”,但在“thread_create”中您根本不使用它:

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

您仅使用指向“foo”函数的指针来调用“克隆”系统调用。从“thread_create”内部,您的“TestCase1”指针被命名为“start_routine”,因此您需要调用类似的“clone”系统调用,但您应该将指针传递给“TestCase1”而不是指向“foo”的指针。类似的东西:

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

关于c - 实现和测试 thread_create 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40910389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com