将参数传递给多个线程
问题描述:
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;
}
正在孕育线程同样的事情后,调用main
free(arg);
/安全吗?
答
如果所有线程需要完全相同的参数,而且他们没有修改的说法,有没有需要动态地在所有分配它,而不是仅仅把它声明为在main
功能函数范围的变量。如果没有动态分配,则不需要释放它。
。如果需要单独的参数在一个循环中像你这样做,你需要使用一个数组来保存所有参数的轨道,例如另一方面:
// Rest of program...
#define NUMBER_OF_ITERATIONS 2
int main(void)
{
int args[NUMBER_OF_ITERATIONS];
pthread_t threads[NUMBER_OF_ITERATIONS][2];
// Create threads
for (unsigned i = 0; i < NUMBER_OF_ITERATIONS; ++i)
{
args[i] = i;
pthread_create(&threads[i][0], NULL, foo, &args[i]);
pthread_create(&threads[i][1], NULL, bar, &args[i]);
}
// Wait for threads to finish
for (unsigned i = 0; i < NUMBER_OF_ITERATIONS; ++i)
{
pthread_join(threads[i][0]);
pthread_join(threads[i][1]);
}
return 0;
}
上面也该方案解决了另一个问题,你有,当你创建总共四个线程,但只加入两个。
答
在调用free(arg)
之前,您需要确保两个线程都已完成。
这意味着您可以在之后这两个线程上调用pthread_join
。
for (i = 0; i < 2; i++){
pthread_join(threads[i],NULL);
}
free(args);
+0
我打算接受Jaochim的回答,因为它也指出在这种情况下,没有必要动态分配它。但+1导致我们超级有用!谢谢 –
顺便说一句。你想在'for()'循环中调用2'pthread_create()'吗? – chux