pthread创建在函数中生成的管理值(在c中)

时间:2015-12-14 13:01:58

标签: c multithreading

我是多线程编程的初学者。我有一个功课,我应该创建一些线程(在我的情况下为10)并在每个内部生成一个随机数。 当我调试我的代码(或放入' sleep(1)'命令)时,它正常工作,否则生成的值不再相等。 如果您认为我仍然做了些什么并且理解它,请帮助我解释一下。 代码:

#include<stdio.h>
#include<pthread.h>
#include<time.h>

int rn, sharedArray[10];
pthread_mutex_t lock;


int randomgenerator(){
    //sleep(1);
    srand(time(NULL)); // The value of random depend on the time with some changes in the time library
    int rn, MAX = 10; //  between 0 and 10
    rn = rand()%MAX;
    return rn;
}

void *rgen(void *arg){
    int order = (int*)arg;
    //pthread_mutex_lock(&lock);
    int rn = randomgenerator();
    printf("%d,%d\n", order,rn); //not working without printf why????
    sharedArray[order]= rn;
    //pthread_mutex_unlock(&lock);
    pthread_exit(NULL);
}

void main(int argc, char *argv[]){
    pthread_mutex_init(&lock, NULL);
    pthread_t th[10];
    int i;
    for (i = 0; i <10; i ++){
        pthread_create(&(th[i]), 0, rgen, (void *)i);
        pthread_join(th[i], NULL);
    }

    int j, result = 0;
    for (j=0; j<10; j++){
        result = sharedArray[j] + result;
    }
    printf("the final result is: %d\n",result);
    pthread_exit(NULL);
    pthread_mutex_destroy(&lock);
}

输出是:

0,3
1,3
2,3
3,3
4,3
5,3
6,3
7,3
8,3
9,3
the final result is: 30

我期望取消睡眠的输出是:

0,7
1,4
2,1
3,8
4,5
5,2
6,9
7,6
8,3
9,0
the final result is: 45

1 个答案:

答案 0 :(得分:1)

问题在于这一行:

srand(time(NULL));

rand / srand的手册页说:

  

srand()函数将其参数设置为rand()返回的新的伪随机整数序列的种子。通过使用相同的种子值调用srand(),可以重复这些序列。

每次都设置一个新种子。那是错的! You should only call srand once

当您注释掉睡眠时,所有线程都会设置相同的种子,然后获取该序列中的第一个随机数。如果他们在同一秒内完成它们,它们每个都会得到相同的随机值。

解决方案:

在创建任何主题之前,将调用移至srandmain

注意:

  

函数rand()不可重入或线程安全,因为它使用在每次调用时修改的隐藏状态。

这意味着您无法从多个线程同时安全地呼叫rand。您应该使用互斥锁或信号量来保护呼叫,或者切换到可重入的功能,例如rand_r