顺序程序访问整个数组

时间:2014-01-10 20:50:35

标签: c++ c arrays multithreading sequential

我正在研究线程,但在使用线程之前,我要编写2个程序。

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

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

    #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;
    }
    

    我想知道上述程序是否是顺序程序?我运行了程序,它访问整个数组并执行一项任务,即打印出数组中的所有数据。

    我在线研究了顺序程序意味着什么,我发现它意味着以下语句:在任务b之前执行任务a但不是同时执行任务。这是对的吗?

    对于第二部分,我做了以下几点:

    #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] );
          }
       }
    }
    

    我是朝着正确的方向前进的吗?因为我还要编写一个程序版本,允许在一个或多个线程中执行处理。

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

3 个答案:

答案 0 :(得分:1)

我认为你没有朝着正确的方向前进,但你并不遥远。指令要求的是按顺序处理数组并使其并行运行所需的一些初步步骤。在编写并行程序时,从一个有效的顺序程序开始并慢慢将其转换为并行程序通常很有用。遵循说明是一种方法。

让我们分开考虑问题的各个部分:

  • 设置一个数组并编写一个顺序程序来访问整个数组,并对内容执行一些简单的任务。

您为阵列选择的简单任务是打印内容,但这不是一个合适的任务,因为它没有功能结果。更合适的任务是对数组中的元素求和。其他任务可能是计算满足某些条件的元素,或者将每个元素多个数量计算。

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

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

  • 修改程序,使其仍然是顺序的,但是通过对函数的一系列调用来访问数组。每次调用该函数都将处理由传递给函数的参数定义的数组的多个行。

在这部分中,您要做的是将功能分解为一小部分工作。 (最后,您将这些工作单元发送给线程进行处理,但您现在只是在执行预备步骤。)如果我们在第1部分中进行了总结,那么您可以编写一个int sumKitems(int *array, int startIndex, int numItems)的函数。然后主程序会在数组中的每组(例如)10个项目上调用它,并通过对每个sumKitems调用的结果求和来合并完整的结果。

所以,如果数组中有100个项目,你可以对sumKitems(...)进行10次调用,告诉函数处理0 ... 9,10 ... 19,...,90 .. 0.99。这将取代单独对所有100个项目进行总和。

-

总而言之,第一部分将是一个简单的for循环,与你所写的不同,只是执行了一些计算。

第二部分应该执行完全相同的计算并返回完全相同的结果,只需使用另一个函数调用来处理k个项目。 (如果您一次传递要处理的项目数作为参数,您将能够平衡通信成本与移动到线程实现时正在完成的工作。)

最后,可能会要求您将对sumKitems(...)的调用替换为将工作发送到线程以独立完成的队列。

答案 1 :(得分:0)

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

总结:您的代码在单个线程上运行 - 它是顺序的

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

答案 2 :(得分:0)

按顺序对数组执行操作将从数组的第一个位置开始,并在执行操作时逐步增加数组

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}

进行两次递增

每次增加一个地方,两个线程同时运行