二进制处理树给出错误的结果

时间:2014-02-12 21:18:12

标签: c fork

我必须制作一个二进制处理树来对某些记录进行排序,但我已经陷入了创作之中。 我正在使用这个递归代码来生成proccesses的二叉树:

void proc_tree(int i, int current_depth, int max_depth, int rec, int offset)
{
  pid_t kid = fork();

  if(kid == 0)
  {
    printf("[%d,%d]: start: %d, end: %d\n", i, current_depth, rec, offset);

    if(current_depth < max_depth)
    {
      int nodes= pow(2, current_depth);

      if(i >= nodes)
       i = 0;

      proc_tree(2*i+1, current_depth+1, max_depth, rec, offset/2);
      proc_tree(2*i+1, current_depth+1, max_depth, offset/2, offset);
    }
   }
}

我没有包含任何错误检查,我没有包含父亲的代码,因为他唯一要做的就是等待孩子们结束。

我得到的输出是:

[0,0]: start: 0, end: 180
[1,1]: start: 0, end: 90
[3,2]: start: 0, end: 45
[4,2]: start: 46, end: 90
[2,1]: start: 91, end: 180
[1,2]: start: 91, end: 90
[2,2]: start: 91, end: 180

正如您所看到的,大多数值都很好,但在深度= 2时,第一个节点([1,2])和([2,2])的值不正确。由于我们在深度= 2处共有181条记录,因此有4个节点,因此每个节点应该管理大约45个记录。所以[1,2]应该是91,136 [2,2]应为137,180。

我正在调用main这样的函数

proc_tree(0, 0, 2, 0, 180);

任何帮助将不胜感激。 提前谢谢。

1 个答案:

答案 0 :(得分:2)

您确实意识到fork创建了一个新进程,每个进程都有自己的内存副本。

此外,操作系统可以按照任何顺序自由处理。

我猜你在考虑递归。在这种情况下,您不需要fork。