从主函数外部调用pthread_create

从主函数外部调用pthread_create,c,pthreads,pthread-join,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,

我想这样做:

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
中生成一些线程并继续做更多的工作。。。然后,当完成更多工作时,等待线程完成

它可以很好地编译,但是当在
do\u work\u son
内部访问
数据时,
结构已损坏。我认为这是因为线程正在退出,即使我正在调用join in
main
。如果我移动
pthread{create,join}
调用这两个函数来启动线程,它可以正常工作,但是我的主函数会被while循环阻塞。我这样做疯了吗

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

不,这是因为
data
start\u-thread()
函数中的一个自动变量,当
start\u-thread()
返回时,该变量无效,因此使用它的地址会调用未定义的行为


要么
malloc()
为它占用了一些内存,要么使它成为静态的,或者诸如此类。只需确保它在
start\u thread()

死亡后仍能生存。答案很简单:您正在传递局部变量的引用,然后离开作用域。用在堆上分配的数据替换它,它将像一个符咒一样工作

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

我打字太慢:(离题:我更喜欢你的旧照片;)@DanielFischer这些天我一直在打字(实现一种脚本语言)。对于照片:我希望某些“某人”会喜欢它。太遗憾了,她没有…@DanielFischer,但这种情况将持续下去,也许有人想知道这个H2CO3家伙到底是谁P@H2CO3你是说
malloc
可以发生在
start\u线程中,并且在作用域离开
start\u线程后它将继续存在吗?@H2CO3还有一个问题:这是正确使用
malloc
的一个具体情况吗?你能给我一个试金石测试,看看什么时候使用
malloc
比其他方法更合适吗?谢谢,您刚刚正确地使用了
malloc()。现在很少有钻石了。有没有一种方法可以用值初始化mystruct以及一步完成malloc?@g33kz0r,如果你的数据是POD:你总是可以从一些预先创建的结构(静态、本地、其他)中进行赋值:
*data=my_preset_data
。我自己更像是一个python人。本周,我特意回到C,作为一种锻炼,迫使自己再次认真对待计算。@g33kz0r现在,这种态度本身值得对你的评论投上一票。