将参数传递给多个线程
Pass argument to multiple threads
C 的新手,我正在阅读 here 关于如何正确地将参数传递给线程的内容。如果需要将此参数传递给多个线程怎么办? Where/how 我应该使用 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);
是否相同/安全?
您需要确保两个线程都已完成,然后再调用 free(arg)
。
这意味着您可以在 在两个线程上调用 pthread_join
之后 执行此操作。
for (i = 0; i < 2; i++){
pthread_join(threads[i],NULL);
}
free(args);
如果所有线程都需要完全相同的参数,并且它们没有修改参数,则根本不需要动态分配它,而只需在 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;
}
上面的程序还解决了您遇到的另一个问题,当您总共创建了四个线程但只加入了两个。
C 的新手,我正在阅读 here 关于如何正确地将参数传递给线程的内容。如果需要将此参数传递给多个线程怎么办? Where/how 我应该使用 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);
是否相同/安全?
您需要确保两个线程都已完成,然后再调用 free(arg)
。
这意味着您可以在 在两个线程上调用 pthread_join
之后 执行此操作。
for (i = 0; i < 2; i++){
pthread_join(threads[i],NULL);
}
free(args);
如果所有线程都需要完全相同的参数,并且它们没有修改参数,则根本不需要动态分配它,而只需在 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;
}
上面的程序还解决了您遇到的另一个问题,当您总共创建了四个线程但只加入了两个。