C的新手,我正在阅读有关如何正确地将参数传递给线程的here。如果这个参数需要传递给多个线程呢?我应该在哪里/如何使用free()
?说:
void *foo(void *i) {
int a = *((int *) i);
while(1){
printf("foo running \n");
sleep(1);
}
}
void *bar(void *i) {
int a = *((int *) i);
while(1){
printf("bar running \n");
sleep(1);
}
}
int main() {
pthread_t threads[2];
int i;
for (i = 0; i < 2; i++ ) {
int *arg = malloc(sizeof(*arg));
if ( arg == NULL ) {
fprintf(stderr, "Couldn't allocate memory for thread arg.\n");
exit(1);
}
*arg = i;
pthread_create(&threads[0], NULL, foo, arg);
pthread_create(&threads[1], NULL, bar, arg);
}
for (i = 0; i < 2; i++){
pthread_join(threads[i],NULL);
}
return 0;
}
在生成线程相同的东西/安全后,在free(arg);
中调用main
?
答案 0 :(得分:2)
在调用free(arg)
之前,您需要确保两个线程都已完成。
这意味着你可以在之后在两个线程上调用pthread_join
。
for (i = 0; i < 2; i++){
pthread_join(threads[i],NULL);
}
free(args);
答案 1 :(得分:2)
如果所有线程都需要完全相同的参数,并且它们没有修改参数,则根本不需要动态分配它,而只需将它声明为{{1}中函数作用域的变量功能。如果没有动态分配,则无需释放它。
另一方面,如果你需要在循环中使用单独的参数,则需要跟踪所有参数,例如使用数组:
main
上面的程序还可以解决您遇到的另一个问题,当您创建总共四个线程但只加入两个线程时。