我正在学习如何在C中使用线程,并尝试使用工作函数(一个带有' void* helperFunc(void *arg)
'签名)来调用常规函数并将其传递给地址数组中的整数。
有时,输出将是正确的(零列表)。其他时候,会有垃圾值而不是0。
所有线程都没有尝试访问共享资源,我相信我已正确地对数组进行了初始化,因此我不了解垃圾值的来源。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
#define N 10
void runMe(int *arg) {
printf("Hello %d\n", *arg);
}
void *helperFunc(void *arg){
runMe((int*)arg);
}
int run_threads(void){
pthread_t thread[N];
int num[N] = {0};
int i = 0;
for (i = 0; i < N; i++){
pthread_create(&(thread[i]), NULL, helperFunc, &(num[i]));
}
}
int main(){
run_threads();
sleep(1);
return 0;
}
预期产出:
Hello 0
Hello 0
Hello 0
Hello 0
Hello 0
Hello 0
Hello 0
Hello 0
Hello 0
Hello 0
实际输出:
Hello 0
Hello 0
Hello 0
Hello 0
Hello 0
Hello 0
Hello 32757
Hello 4195339
Hello 0
Hello -334463544
任何帮助都将不胜感激。
答案 0 :(得分:2)
您正在向线程传递对象的地址,这些对象在访问时无法保证存在。只要run_threads
返回,num
就不再存在。