C++ 访问整个阵列的顺序程序

C++ 访问整个阵列的顺序程序,c++,c,arrays,multithreading,sequential,C++,C,Arrays,Multithreading,Sequential,我正在处理线程,但是在使用线程之前,我要编写两个程序 设置一个数组并编写一个顺序程序,该程序访问整个数组并对内容执行一些简单的任务 修改程序,使其仍然是顺序的,但通过一系列函数调用来访问数组。对该函数的每次调用都将处理由传递给该函数的参数定义的数组中的许多行 我在理解这些问题时遇到了问题,看起来很简单,但我似乎无法集中注意力。在开始创建允许在一个或多个线程中执行处理的程序之前,我将根据上述两个问题编写程序。每个线程应该访问数组中不同的一组行 对于第一个问题,到目前为止我编写的代码是 #inclu

我正在处理线程,但是在使用线程之前,我要编写两个程序

  • 设置一个数组并编写一个顺序程序,该程序访问整个数组并对内容执行一些简单的任务
  • 修改程序,使其仍然是顺序的,但通过一系列函数调用来访问数组。对该函数的每次调用都将处理由传递给该函数的参数定义的数组中的许多行
  • 我在理解这些问题时遇到了问题,看起来很简单,但我似乎无法集中注意力。在开始创建允许在一个或多个线程中执行处理的程序之前,我将根据上述两个问题编写程序。每个线程应该访问数组中不同的一组行

    对于第一个问题,到目前为止我编写的代码是

    #include <iostream>
    #include <stdio.h>
    
    int main()
    {
        int array [20][20];
        int i, j;
    
        /* output each array element's value */
       for ( i = 0; i < 20; i++ )
       {
          for ( j = 0; j < 20; j++ )
          {
             printf("a[%d][%d] = %d\n", i,j, array[i][j] );
          }
       }
       system ("PAUSE");
        return 0;
    }
    
    #包括
    #包括
    int main()
    {
    整数数组[20][20];
    int i,j;
    /*输出每个数组元素的值*/
    对于(i=0;i<20;i++)
    {
    对于(j=0;j<20;j++)
    {
    printf(“a[%d][%d]=%d\n”,i,j,数组[i][j]);
    }
    }
    系统(“暂停”);
    返回0;
    }
    
    我想知道上面的程序是否是顺序程序?我已经运行了程序,它访问了整个阵列,并执行了一项任务,即打印出阵列中的所有数据

    我在线研究了顺序程序的含义,发现它的意思是:在任务b之前执行任务a,但不要同时执行任务b。是这样吗

    对于第二部分,我做了以下工作:

    #include <iostream>
    #include <stdio.h>
    
    void print_array(int array[20][20]);
    
    int main()
    {
        int array [20][20];
        int i, j;
    
        print_array(array);
    
       system ("PAUSE");
        return 0;
    }
    
    // Output data in an array
    void print_array(int array)
    {
        int  i, j;
        for ( i = 0; i < 20; i++ )
       {
          for ( j = 0; j < 20; j++ )
          {
             printf("a[%d][%d] = %d\n", i,j, array[i][j] );
          }
       }
    }
    
    #包括
    #包括
    void print_数组(int数组[20][20]);
    int main()
    {
    整数数组[20][20];
    int i,j;
    打印数组(数组);
    系统(“暂停”);
    返回0;
    }
    //在数组中输出数据
    无效打印数组(整数数组)
    {
    int i,j;
    对于(i=0;i<20;i++)
    {
    对于(j=0;j<20;j++)
    {
    printf(“a[%d][%d]=%d\n”,i,j,数组[i][j]);
    }
    }
    }
    
    我走的方向对吗?我还编写了一个版本的程序,允许在一个或多个线程中执行处理


    编辑:我将使用2D数组,很抱歉上面不清楚

    我相信,如果您没有以任何方式创建单独的线程,那么实际上您正在编写一个顺序程序。代码中没有跳转到新线程执行某些操作而主线程执行其他操作的部分

    摘要:您的代码在单个线程上运行-它是连续的


    您必须将数组作为双指针传递,而不是作为整数传递->
    int-array[][]
    int**array

    顺序对数组执行操作将从数组中的第一个位置开始,并在执行操作时通过数组递增

    array[10] = {0,1,2,3,4,5,6,7,8,9}
      iterate through array with some action such as adding +5
      array [10] = {5,6....}
    
    要使此多线程化,您需要让不同的线程在数组的不同段(如位置0-4、5-9)上运行,并执行该操作,以便在更短的时间内完成。如果你这样做的话,你就不需要担心互斥锁了

    所以线程1通过数组[10]{0,1,2,3}递增

    通过数组[10]{4,5,6,7}执行两个增量


    每次递增一个位置,两个线程同时运行

    我不认为你走的方向正确,但你已经走得不远了。这些指令要求的是按顺序处理数组并使其并行运行所需的一些初步步骤。在编写并行程序时,通常从一个工作的顺序程序开始,然后慢慢地将其转换为并行程序。按照说明进行操作是一种方法

    让我们分别考虑问题的部分:

    • 设置一个数组并编写一个顺序程序,该程序访问整个数组并对内容执行一些简单的任务
    为数组选择的简单任务是打印内容,但这不是合适的任务,因为它没有功能结果。更合适的任务是对数组中的元素求和。其他任务可能是计算满足某些条件的元素,或者将每个元素乘以两

    因此,首先尝试修改初始程序,对元素求和,而不是打印它们

    (在代码中,您使用的是二维数组。为了简单起见,我建议使用一维数组。)

    • 修改程序,使其仍然是顺序的,但通过一系列函数调用来访问数组。对该函数的每次调用都将处理由传递给该函数的参数定义的数组中的许多行
    在本部分中,您将尝试将功能分解为小块工作。(最终您将把这些工作单元发送给线程进行处理,但现在您只是在做初步的步骤。)如果我们在第1部分中做了一个求和,那么您可以在这里编写一个函数,它是
    int-sumKitems(int*array,int-startIndex,int-numItems)
    。然后,主程序将对数组中的每组(比如)10个项调用该函数,并通过对每个
    sumKitems
    调用的结果求和来组合完整的结果

    因此,如果数组中有100个项,您可以调用10个
    sumKitems(…)
    ,告诉函数处理0…9、10…19、90…99。这将代替对所有100个项目单独进行合计

    --

    总而言之,第一部分将是一个简单的for循环,与您编写的内容没有太大区别,只是执行了一些计算

    第二部分应该执行完全相同的计算并返回完全相同的结果,只需使用另一个函数调用,该函数同时处理
    k
    项。(如果您将一次要处理的项目数作为参数传递,您将