2

我想做这样的事情:

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);
}

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

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

4

2 回答 2

5

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

不,那是因为datastart_thread()函数中的一个自动变量,返回时无效start_thread(),所以之后使用它的地址会调用未定义的行为。

要么malloc()为它吃一些内存,要么让它成为静态的,或者其他什么。只要确保它在start_thread().

于 2013-03-14T21:15:48.500 回答
4

答案很简单:你传递了一个局部变量的引用,然后离开了作用域。用堆上分配的数据替换它,它就像一个魅力

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

编辑:

关于预习题:

void start_thread(pthread_t *mt)
{
    mystruct local_data = {...};
    mystruct *data = malloc(sizeof(*data));
    *data = local_data;
    ...;
    pthread_create(mt, NULL, do_work_son, data);
}
于 2013-03-14T21:16:14.360 回答