gpt4 book ai didi

c - pthread_create() 之后主线程不再继续执行

转载 作者:行者123 更新时间:2023-12-02 15:23:18 32 4
gpt4 key购买 nike

我使用pthread_create()创建了一个线程。新线程创建成功,控制权传递给新创建的线程。然而,主线程似乎不再执行了。主线程处于无限循环中并且永远不会退出。以下是代码片段:

void *start_routine(void)
{
printf("Start routine reached!\n");
fflush(stdout);

printf("Pthread returning!\n");
fflush(stdout);

return NULL;
}

void create_thread()
{
pthread_t newThread;

printf("Thread create reached!!\n");
fflush(stdout);

/* Create the new thread */
if((pthread_create(&newThread, NULL, start_routine , NULL)) != 0 ){
perror("pthread_create");
fflush(stdout);
}

printf("Thread create done!!\n");
fflush(stdout);

return;
}

输出为:

Thread create reached!!
Start routine reached!
Pthread returning!

我没有看到“线程创建完成!!”正在打印,程序就卡在此时。

任何指示都会有帮助。谢谢!

最佳答案

应该是你的start_routine签名错误造成的。 pthread_create 的入口例程的标准签名是 void *(*start_routine)(void *)。在pthread_create的实现中,假设将调用start_routine,并使用start_routine参数,在您的情况下,create_thread为其提供值NULL,因此,在pthread_create中,NULL在调用start_routine之前被压入堆栈,但是,在 start_routine 之后,您的 start_routine 不会按照 pthread_create(实际上是 pthread_create 调用的内部例程)的预期恢复堆栈完成后,堆栈超出预期,并且可能遇到地址NULL,这可能会导致您的程序很快中止。

当参数通过堆栈传输时会出现问题。要更正它,只需将 start_routine 更正为 void *start_routine(void* args) 即可。并且,在主线程中,调用pthread_join来等待派生的线程完成,否则,资源泄漏将是一个潜在的问题。

如果您对 Linux NPTL pthread_create 的内部工作感兴趣,您可以访问 http://raison.gegahost.net/?p=91 .

关于c - pthread_create() 之后主线程不再继续执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15454019/

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