【问题标题】:Sequential program that accesses the whole of the array访问整个数组的顺序程序
【发布时间】:2014-01-10 20:50:35
【问题描述】:

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

  1. 设置一个数组并编写一个顺序程序来访问整个数组并对内容执行一些简单的任务。
  2. 修改程序,使其仍然是顺序的,但通过对函数的一系列调用来访问数组。对该函数的每次调用都将处理数组的若干行,这些行由传递给该函数的参数定义。

我在理解这些问题时遇到了问题,看起来很简单,但我似乎无法理解它。在我开始创建一个允许处理在一个或多个线程中执行的程序之前,我将根据上述两个问题编写程序。每个线程都应该访问数组的一组不同的行。

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

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

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

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

【问题讨论】:

    标签: c++ c arrays multithreading sequential


    【解决方案1】:

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

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

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

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

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

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

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

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

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

    --

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

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

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

    【讨论】:

    • 另外,为了在两种设置中获得相同的结果,我建议将数组初始化为已知值。
    • 当然——您需要能够验证事情在每一步中仍然有效。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      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 并执行操作,以便可以在更短的时间内完成。如果您这样做,您将无需担心互斥锁。

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

      通过array[10] {4,5,6,7}线程两个增量

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多