如何让C中的多个线程处理二维数组的同一个for循环



我在C.中有一个程序

我用pthread_create创建了3个线程,并创建了一个互斥对象以便锁定/解锁关键区域。

pthread_create3nd参数是指向线程将执行的函数的指针。

在我在网上找到的例子中,这个函数总是非常简单,例如打印线程id或打印消息。

当线程要执行的函数包含一个for循环时,会发生什么

因为在我的程序中,我希望每个线程都使用二维数组。

每个线程应找到二维数组中一条线的总和。例如

线程1应计算二维数组第一行的总和

Thread2应计算第二行的总和
Thread1将计算第三行的总和
Thread3应该计算第三线的总和

我不在乎线程的顺序,但我需要每一个线程以拾取其中一条线。

我有下面的代码,求和二维数组中的两个单元格。

程序:

  1. 创建NTHREADS

    for(i=0; i < NTHREADS; i++)
    {
    pthread_create( &thread_id[i], NULL, CalculateSum, NULL );
    }
    
  2. 每个线程等待其他线程完成

    for(j=0; j < NTHREADS; j++)
    {
    pthread_join( thread_id[j], NULL);
    }
    
  3. 每个线程应执行的函数是,但对于数组的一行和整个数组的NOT

    void *CalculateSum(void *dummyPtr)
    {
    pthread_mutex_lock( &mutex1 );
    int i,j,sum = 0;
    for( i = 0; i <= N-1; i++) {
    for( j = 0; j <= M-1; j++) {
    sum = dimensional_array[i][j] + dimensional_array[i][j];
    }
    printf(" Sum = %dn", sum);
    }
    counter++;
    pthread_mutex_unlock( &mutex1 );
    }
    

整个程序如下:该程序没有任何编译错误。

为了运行它,您应该执行:gcc-pthread program.c

//program.c
#include <stdio.h>
#include <pthread.h>
#define NTHREADS 3
void *CalculateSum(void *);
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int  counter = 0;
#define N 10
#define M 10
int dimensional_array[N][M];
main()
{
pthread_t thread_id[NTHREADS];
int i, j;
for (i = 0; i <= N - 1; i++ )
for( j = 0; j <= M - 1; j++)
dimensional_array[i][j] = i;
for(i=0; i < NTHREADS; i++)
{
pthread_create( &thread_id[i], NULL, CalculateSum, NULL );
}
for(j=0; j < NTHREADS; j++)
{
pthread_join( thread_id[j], NULL);
}

printf("Final counter value: %dn", counter);
//print ARRAY
for (i = 0; i <= N-1; i++ ) {
for( j = 0; j <= M-1; j++)
printf("%dt",dimensional_array[i][j]);
printf("n");
}
}
//Calculate
void *CalculateSum(void *dummyPtr)
{
pthread_mutex_lock( &mutex1 );
int i,j,sum = 0;
for( i = 0; i <= N-1; i++) {
for( j = 0; j <= M-1; j++) {
sum = dimensional_array[i][j] + dimensional_array[i][j];
}
printf(" Sum = %dn", sum);
}
counter++;
pthread_mutex_unlock( &mutex1 );
}

所以,我希望每个线程都能找到一行的总和,但我很困惑,我不知道如何做到这一点。

在我的程序中,每次线程调用Calculate函数时,都会计算所有行的总和,而不仅仅是一个

[注意:为了简单起见,我将第一个元素与它自己的元素相加,重点是要理解这些线程是如何在for循环中发生的

如果有人能帮我,我会很高兴

谢谢,提前

您应该创建一个每个线程的参数数组,并将这些参数逐个传递给线程。在您的情况下,指向int的单个指针就足够了:您将其索引threadindex从零传递给线程到NTHREADS,线程将行的总和传递回,例如row % NTHREADS == threadindex

以下是线程函数的外观:

void *CalculateSum(void *args)
{
int *argPtr = args;
int i,j,sum = 0;
int threadindex = *argPtr;
for( i = 0; i <= N-1; i++) {
if (i % NTHREADS != threadindex) continue;
for( j = 0; j <= M-1; j++) {
sum += dimensional_array[i][j];
}
}
pthread_mutex_lock( &mutex1 ); Mutex must go here
counter++;
pthread_mutex_unlock( &mutex1 );
// Pass the value back:
*argPtr = sum;
}

main()
{
pthread_t thread_id[NTHREADS];
int thread_args[NTHREADS];
int i, j;
pthread_mutex_init(&mutex1, NULL);
for (i = 0; i <= N - 1; i++ )
for( j = 0; j <= M - 1; j++)
dimensional_array[i][j] = i;
for(i=0; i < NTHREADS; i++)
{
thread_args[i] = i;
pthread_create( &thread_id[i], NULL, CalculateSum, &thread_args[i]);
}
int sum = 0;
for(j=0; j < NTHREADS; j++)
{
pthread_join( thread_id[j], NULL);
sum += thread_args[i];
}
printf("Final counter value: %d. Total: %dn", counter, sum);
}

计算一行的总和(忽略线程内容):

void *CalculateSum(void *dummyPtr)
{
int j,sum = 0;
int i = (int)dummyPtr;
for( j = 0; j <= M-1; j++) {
sum += dimensional_array[i][j];
}
printf(" Sum = %dn", sum);
pthread_mutex_lock( &mutex1 );
counter++;
pthread_mutex_unlock( &mutex1 );
}

然后创建这样的线程:

int line_number = 2;    // Or whatever line to print`enter code here`
pthread_create( &thread_id[i], NULL, CalculateSum, (void *)line_number );

编辑:将"counter++"放回。

最新更新