我正在研究线程,但在使用线程之前,我要编写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] );
}
}
}
我是朝着正确的方向前进的吗?因为我还要编写一个程序版本,允许在一个或多个线程中执行处理。
编辑:我要使用2D数组,抱歉上面不清楚
答案 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}
进行两次递增每次增加一个地方,两个线程同时运行