繁体   English   中英

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

[英]Main thread does not continue execution after pthread_create()

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM