3

我已经使用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!

我没有看到“线程创建完成!!” 正在打印并且程序此时卡住了。

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

4

1 回答 1

0

应该是你的签名错误造成的start_routine。的入口例程的标准签名pthread_createvoid *(*start_routine)(void *)。在实现中pthread_createstart_routine将调用提供的参数start_routine,在您的情况下,create_thread为它提供值NULL,因此,在pthread_create调用NULL之前将 in 压入堆栈start_routine,但是,您start_routine不会将堆栈恢复为pthread_create(确切地说是由pthread_create)期待,start_routine完成后,堆栈超出预期,并且可能会遇到 address NULL,这可能会导致您的程序很快中止。

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

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

于 2013-03-17T03:44:07.493 回答