从主函数外部调用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 inmain
。如果我移动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现在,这种态度本身值得对你的评论投上一票。