在for循环中创建线程:所有线程都传递相同的" i"值

时间:2015-10-31 18:02:48

标签: c multithreading pthreads

使用此处的建议(How to spawn n threads?),我写了以下内容:

int threads_count = 2;
pthread_t *threads = calloc(threads_count, sizeof(pthread_t));
int j;
for(j = 0; j < threads_count; j++) {
    int thread_number = j;
    int status = pthread_create(&threads[j], NULL, &my_func, (void *) &thread_number);
}

my_func的相关部分是这样的:

void *my_func(void *thread) {
    int *thread_no = (int *) thread;
    pthread_t thread_id = pthread_self();
    printf("Thread number: %i\nThread ID: %u\n", *thread_no, thread_id);

    ...
}

不幸的是,由于我不明白的原因,这导致每个线程都有线程号(不是ID)2。

非常感谢任何建议!

编辑:根据答案的建议,我创建了一个相应整数的全局数组,并在for循环中传递了&amp; arr [i]的引用

1 个答案:

答案 0 :(得分:2)

问题在于:

for(j = 0; j < threads_count; j++) {
    int thread_number = j;
    int status = pthread_create(&threads[j], NULL, &my_func, (void *) &thread_number);
}

作为my_func参数向void*发送局部变量的地址,该变量仅在给定for循环的范围内定义。离开for循环后,对thread_number地址的访问会导致未定义的行为

你可以用

做同样的事情
for(j = 0; j < threads_count; j++) {
    int thread_number = j;
    int status = pthread_create(&threads[j], NULL, &my_func, (void *) thread_number);
}

(将thread_number的值传递为void*),然后将其取消引用:

void *my_func(void *thread) {
    int thread_no = (int)thread;
    pthread_t thread_id = pthread_self();
    printf("Thread number: %i\nThread ID: %u\n", thread_no, thread_id);

    ...
}

然而这不是最佳方法,因为不推荐在intvoid*之间混淆(不仅intvoid*混淆,而且一种非指针类型的指针)。

更好的方法是为每个线程使用一些全局结构,并将该结构的地址作为my_func参数传递给void*