2016-07-23 41 views
0

我正在学习如何在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 

任何帮助,将不胜感激。

回答

2

你传入线程不能保证,当他们访问它存在一个对象的地址。只要run_threads返回,num不再存在。

+0

谢谢。我已经通过使用malloc来为整数分配空间来纠正问题。 –

+1

@ChrisJolly:如果你打算做任何事情与阵列有用,你需要考虑一下返回,以便它可以被释放,并担心你将如何等待线程退出('睡眠(1)'笨拙 - ''pthread_join()'?)等等。也许这就是未来;让它干净地工作是一个开始。 –

+0

谢谢。我已经返回使用int数组,并且使用pthread_join来允许它们在run_threads返回之前完成执行。 –