从外部main函数调用pthread_create

g33*_*z0r 2 c pthreads pthread-join

我想做这样的事情:

void *do_work_son(void *data)
{            
    mystruct *d = (mystruct*)data;
    while(true)
    {
        // d->whatever is corrupt
    }
}

void start_thread(pthread_t *mt)
{
    mystruct data = ...;
    pthread_create(&(*mt), NULL, do_work_son, (void *)&data);
}

int main()
{
    pthread mt;
    start_thread(&mt);
    // do more stuff here
    pthread_join(mt, NULL);
}
Run Code Online (Sandbox Code Playgroud)

这个想法是由一些线程产生的,并继续做更多的工作main...然后当完成更多工作时,等待线程完成.

它编译得很好,但是在data内部访问时结构被破坏了do_work_son.我认为这是因为线程正在退出,即使我正在调用join main.如果我将pthread_{create,join}调用都移动到start_thread,它工作正常,但然后我的main函数被while循环阻止.这样做我疯了吗?

小智 5

我想这是因为线程正在退出,

不,那是因为data函数中的自动变量,返回start_thread()时无效start_thread(),因此使用其地址后会调用未定义的行为.

要么malloc()为它吃一些记忆,要么让它静止,或者其他什么.只要确保它能够幸免于难start_thread().