pthread_create()后主线程不继续执行

时间:2013-03-16 19:57:21

标签: c pthreads

我使用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 !!”正在打印,程序刚刚停留在这一点上。

任何指针都会有所帮助。谢谢!

1 个答案:

答案 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