我使用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!
我没有看到“Thread create done !!”正在打印,程序刚刚停留在这一点上。
任何指针都会有所帮助。谢谢!
答案 0 :(得分:0)
这应该是由start_routine
的错误签名造成的。 pthread_create
的条目例程的标准签名是void *(*start_routine)(void *)
。在pthread_create
的实施中,将调用提供的start_routine
,并使用[{1}}的参数,在您的情况下,start_routine
为其提供值create_thread
,因此,在NULL
中,pthread_create
在调用NULL
之前被推入堆栈中。但是,您的start_routine
不会将堆栈恢复为start_routine
(完全是由内部例程调用pthread_create
}期待pthread_create
完成后,堆栈超出预期,可能会遇到地址start_routine
,这可能会导致您的程序很快中止。
通过堆栈传输参数时会出现问题。要更正它,只需将NULL
更正为start_routine
即可。并且,在主线程中,调用void *start_routine(void* args)
来等待生成的线程完成,否则,资源泄漏将是一个潜在的问题。
如果您对Linux NPTL pthread_join
的内部工作感兴趣,可以访问http://raison.gegahost.net/?p=91。