更改代码以使其并行

标签 c operating-system

   #include <conf.h>
   #include <kernel.h>
   #include <stdio.h>
   #define MAX_ITEMS 50
   typedef long double LD;
   int run_solve_equ();
   void xmain(){
       int pid;
       pid = create(run_solve_equ, 20*INITSTK, INITPRIO, "B", 0);
       resume(pid);
   }
   int solve_equ(LD b, int n, LD a[], int choosen[] ){
       if ( n == 1 )
           if (a[0] == b) {
               choosen[0] = 1;
               return 1;
           } /* if */
           else if (b == 0) {
               choosen[0] = 0;
               return 1;
           } /* else if*/
           else {
               choosen[0] = 0;
               return 0;
           }
       else /* n > 1 */
           if (solve_equ(b, n-1, a, choosen)) {
               choosen[n-1] = 0;
               return 1;
           } /* if */
       else if (solve_equ(b - a[n-1],n-1, a, choosen)) {
           choosen[n-1] = 1;
           return 1;
       } /* else if */
       else{
           choosen[n-1] = 0;
           return 0;
       }
   } /* solve_equ */
   LD a[MAX_ITEMS];
   int choosen[MAX_ITEMS];
   char pstr[200];
   extern long int tod;
   int run_solve_equ() {
       int n, i, result;
       LD b, sum;
       printf("How many numbers? No more than %d:", MAX_ITEMS );
       scanf("%d",&n);
       puts("Enter b:");
       scanf("%Lf",&b);
       a[0] = 1;
       for (i = 1; i < n; i++)
           a[i] = a[i-1]*2;
       result = 0;
       sprintf(pstr, "time = %ld\n", tod);
       printf(pstr);
       result = solve_equ(b,n, a, choosen);
       sprintf(pstr, "time = %ld\n", tod);
       printf(pstr);
       sprintf(pstr, "Solution for b = %Lf, n = %d, value = %d :\n", b,
           n,result);
       printf(pstr);
       printf("\ni:\n");
       for (i = 0; i < n; i++) {
           sprintf(pstr, "%-16d",i);
           printf(pstr);
       } // for
       printf("\na[i]:\n");
       for (i = 0; i < n; i++) {
           sprintf(pstr, "%-16.1Lf", a[i]);
           printf(pstr);
       } // for
       printf("\nchoosen[i]:\n");
       for (i = 0; i < n; i++) {
           sprintf(pstr, "%-16d", choosen[i]);
           printf(pstr);
       } // for
       printf("\n");
       sum = 0;
       for (i = 0; i < n; i++)
           if (choosen[i]) {
               sum += a[i];
               sprintf(pstr, " + %-16.1Lf", a[i]);
               printf(pstr);
           } /* if */
       sprintf(pstr, " = %-16.1Lf\n", sum);
       printf(pstr);
       return 0;
   }

我需要更改此程序,以便两个进程“并行”搜索: 每个用户都会搜索 n-1,第一个用户搜索 [n-1],而另一个则不搜索。 问题是在数组中找到一个数字,所有数字加起来都等于另一个数字 b!

最佳答案

不是答案,但我确实有一些建设性的意见给你。

读上面的代码很痛苦。它伤害了我的眼睛,也伤害了我的大脑。为什么?

  1. 变量名称是非描述性的,通常是一个字母(除了 I)。 bna - 我一眼不知道这些是什么,我不想通过理解来找出它们你写了。我打赌你下周也不会明白你写的东西。帮大家一个忙,让名字变得更好。
  2. 请在您的“代码想法”之间使用一点空格。您的代码看起来像是一个长连贯的句子,但也隐藏了它的作用。
  3. 不要混合使用花括号和非花括号代码 - 特别是当缩进不一致时。现在要遵循你的假设逻辑是非常非常困难的。继续吧,浪费几个字节的硬盘空间,也许还需要 0.25 秒来添加大括号或至少修复缩进。
  4. 撰写有用的评论。 /* if */ 是一个糟糕的注释,你到处都做类似的事情。我知道 if 是什么,但也许是您正在检查的内容的快速 not ?
  5. 不要在代码中间混合全局变量和外部定义。将它们放在一起可以更容易记住什么是全局的、什么不是。但这是最轻微的冒犯,其他人可能不同意。

无论如何,你的问题有点偏离主题,这个问题很可能会结束,因为你自己没有付出什么努力来解决它,但我的评论可能会帮助你完成 future 的编码项目,并且至少会让其他人更容易帮助您前进。

关于更改代码以使其并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17974185/

相关文章:

java - 有人说 - "a thread enters an object' s monitor” 是什么意思?

c++ - 为什么 getenv() 返回一个非常量字符串

c++ - 从 C 回调调用 C++ 方法

c - 解释这个 C 代码的输出?

c - 这个简单的双指针示例中发生了什么

c - C中如何保证数据类型的一致性?

python - 进入子目录、运行命令然后返回的最优雅的方式是什么?

C - 零空间中非零地址的含义

linux - 为什么进程在操作系统中被称为抽象?

process - 操作系统 - 在哪里使用长期调度程序?