并发进程和随机整数

时间:2015-10-11 21:13:27

标签: c random concurrency process

我正在为一个班级工作,我的任务是编写一个程序,创建4个并发运行的子进程。每个子进程必须生成一个包含70个元素的数组,并以10行为单位显示它们。由于某种原因,它不起作用。数组中的所有元素都是相同的数字(每个孩子+100),即。 a1 [0] = 102,a2 [0] = 202,a3 [0] = 302,a4 [0] = 402.有人可以向我解释为什么会这样吗?谢谢。

// include files
#include <stdio.h>
#include <stdlib.h>

// constants
#define LENGTH 70

// function prototypes
int generateArray(int[], int, int);
int quicksort(int[], int, int);
int printArray(int[]);


int generateArray(int array[LENGTH], int min, int max){
  int i;
  for (i = 0; i < LENGTH; i++){
    array[i] = (rand()%(max - min + 1))+ min;
  }
  return 0;
}

int quicksort (int x[LENGTH],int first, int last){
  int pivot, j, temp, i;
  if(first<last){
    pivot=first;
    i=first;
    j=last;

    while(i<j){
      while(x[i]<=x[pivot]&&i<last)
    i++;
      while(x[j]>x[pivot])
    j--;
      if(i<j){
    temp=x[i];
    x[i]=x[j];
    x[j]=temp;
      }
    }

    temp=x[pivot];
    x[pivot]=x[j];
    x[j]=temp;
    quicksort(x,first,j-1);
    quicksort(x,j+1,last); 
  }
}

int printArray (int array[LENGTH]){
  int i, sum = 0;
  for (i = 0; i < LENGTH; i++){
    printf("%d ",array[i]);
    sum += array[i];
    if ((i+1)%10 == 0){
      printf("\n");
    }
  }
  return sum;
}

int main (){
  pid_t child1, child2, child3, child4;
  int sum1=0, sum2=0, sum3=0, sum4=0, sum=0;
  int a1[LENGTH], a2[LENGTH], a3[LENGTH], a4[LENGTH];
  if(!(child1 = fork())){
    //child 1
    generateArray(a1,100,199);
    quicksort(a1,0,LENGTH-1);
    sum1 = printArray(a1);
    printf("Child 1 Sum: %d.\n",sum1);
  } else if (!(child2 = fork())){
    ///child 2
    generateArray(a2,200,299);
    quicksort(a2,0,LENGTH-1);
    sum2 = printArray(a2);
    printf("Child 2 Sum: %d.\n",sum2);
  } else if (!(child3 = fork())){
    //child 3
    generateArray (a3,300,399);
    quicksort(a3,0,LENGTH-1);
    sum3 = printArray(a3);
    printf("Child 3 Sum %d.\n",sum3);
  } else if (!(child4 = fork())){
    //child 4
    generateArray(a4,400,499);
    quicksort(a4,0,LENGTH-1);
    sum4 = printArray(a4);
    printf("Child 4: Sum %d.\n",sum4);
  } else { 
    //parent
  }
  return 0;    
}

在一个不相关的注释中,问题是父母是否可以显示所有数组中所有元素的总和。我不认为这是可能的,因为进程不共享内存,不能在不使用管道的情况下相互通信,我的教授明确表示我们不允许使用。是吗?

1 个答案:

答案 0 :(得分:2)

rand()只是一个伪随机数生成器。如果你没有种子&#34;它的状态,所有过程必然产生相同的序列。查看srand()的手册页。在调用main之后,您应该在fork函数中调用它,以将其设置为更随机的初始状态。请务必选择与您的所有流程不同的种子。