在C叉搜索(Searching with fork in C)

2019-09-24 02:43发布

我应该越来越舒适叉了,我看到了一个练习,说要用叉子呼叫搜索索引值从0到15的阵列我们假设每个进程只能做两件事情... ...( 1)是检查以查看是否阵列是长度为1,和(2)比较的阵列与数的单个元素被搜索。 基本上我传递一个数值,它应该做的叉的数量有限,并返回一个数字的指数。 这里是我的代码..

#define MAXINDEX 16

int forkSearch(int a[], int search, int start, int end){
  if(start == end){
    if(*(a + end) == search){
      return end;
    }
  } 
  else{
    pid_t child = fork();
    if(child == 0) return forkSearch(a, search, start, end/2);
    else return forkSearch(a, search, (start + end)/2, end);
  }
}

int main(int argc, char* argv[]){
  int searchArray[MAXINDEX] = {1, 12, 11, 5, 10, 6, 4, 9, 13, 2, 8, 14, 3,\
                               15, 7};
  printf("Should be 1. Index of 12 = %d\n", forkSearch(searchArray,
                                                       12, 0, MAXINDEX));
  return 0;
} 

在这个快速爆炸计划的回归似乎一切都可以是1,10,11,或13为什么没有这方面的工作像它应该。

Answer 1:

if(child == 0) return forkSearch(a, search, start, end/2);

这是错误end在那里,应该(start+end)/2 ,并在右半搜索的开始索引应该是(start+end)/2 + 1 。 否则,如果右半边是(start+end)/2 .. end ,当end == start+1 ,在start的递归调用是旧的start值和你有一个无限循环。

你的程序有不确定的行为,因为

int forkSearch(int a[], int search, int start, int end){
  if(start == end){
    if(*(a + end) == search){
      return end;
    }
  }

没有返回值,如果start == end ,但*(a+end) != search 。 添加exit(0); 内后if退出未找到目标的过程。

int searchArray[MAXINDEX] = {...};

forkSearch(searchArray, 12, 0, MAXINDEX)

会导致在一个彻头彻尾的越界访问searchArray[MAXINDEX]也是不确定的行为。



文章来源: Searching with fork in C