使用此处的建议(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]的引用
答案 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);
...
}
然而这不是最佳方法,因为不推荐在int
和void*
之间混淆(不仅int
与void*
混淆,而且一种非指针类型的指针)。
更好的方法是为每个线程使用一些全局结构,并将该结构的地址作为my_func
参数传递给void*
。