ç线程使垃圾输出访问非共享资源
问题描述:
我正在学习如何在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
任何帮助,将不胜感激。
答
你传入线程不能保证,当他们访问它存在一个对象的地址。只要run_threads
返回,num
不再存在。
谢谢。我已经通过使用malloc来为整数分配空间来纠正问题。 –
@ChrisJolly:如果你打算做任何事情与阵列有用,你需要考虑一下返回,以便它可以被释放,并担心你将如何等待线程退出('睡眠(1)'笨拙 - ''pthread_join()'?)等等。也许这就是未来;让它干净地工作是一个开始。 –
谢谢。我已经返回使用int数组,并且使用pthread_join来允许它们在run_threads返回之前完成执行。 –