многопоточное добавление матрицы путем отправки структуры в функцию pthread_create ()? - PullRequest
0 голосов
/ 28 февраля 2011

моя цель в следующем коде - добавить 2-мерные матричные элементы одним процессом и многопоточной программой. Поскольку функция pthread_create () принимает только 4 параметра, я хочу отправить два параметра, инкапсулируя в структуру. Но яНе можете отправить его правильно. Пожалуйста, помогите мне, что я могу сделать в этом коде?

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <pthread.h>
#include <malloc.h>

void *addition (void *ptr);

struct numbers {
   int num1,num2;
};

pthread_mutex_t mymutex=PTHREAD_MUTEX_INITIALIZER;

main() {
  int matrix_1[10][10];
  int matrix_2[10][10];
  int matrix_3[10][10];
  int iret[10][10];

  int i,j;

  struct numbers num[10][10];
  struct numbers *ptr;

  ptr= (struct numbers *) malloc (sizeof(struct numbers));
  ptr=num;

   srand(time(NULL));

   for(i=0;i<10;i++) 
   {
      for(j=0;j<10;j++)
       {
            matrix_1[i][j]=rand()%100;
       }
   }

   for(i=0;i<10;i++)
   {
      for(j=0;j<10;j++)
       {
            matrix_2[i][j]=rand()%100;
       }
   }


   for(i=0;i<10;i++)
   {
      for(j=0;j<10;j++)
       {
            matrix_3[i][j]=matrix_1[i][j]+matrix_2[i][j];
       }
   }

pthread_t thread[100];

for(i=0;i<10;i++)
{
   for(j=0;j<10;j++)
   {

        iret[i][j] = pthread_create( &thread[i][j], NULL ,addition,(void)ptr[i][j]);

    if ( iret[i][j]!=0 )          {
     printf("error creating thread.");
     abort();
    }
    pthread_join( thread[i][j], NULL);

    if ( pthread_join ( thread[i][j], NULL ) )     {
    printf("error joining thread.");
    abort();
    }
  }

   exit(0);
}

void *addition (void *ptr)
{
int i,j;
int matrix_toplam[10][10];
struct numbers *my_ptr;

my_ptr = (struct numbers *)malloc (sizeof(struct numbers));
my_ptr=(struct numbers *)ptr;

 for(i=0;i<10;i++)
 {
    for(j=0;j<10;j++)
    {  
       pthread_mutex_lock(&mymutex);
       matrix_toplam[i][j]=my_ptr[i][j]->num1 + my_ptr[i][j]->num2;

       pthread_mutex_unlock(&mymutex);  
    }
 }
}

1 Ответ

1 голос
/ 01 марта 2011

Взгляните на свою линию

iret[i][j] = pthread_create( &thread[i][j], NULL ,addition,(void)ptr[i][j]);

4-й параметр должен быть void* в соответствии с руководством , а не (void).Вам также нужен адрес элемента, который можно легко сделать, добавив & к ptr[i][j]

Ваш код необходимо очистить, поэтому есть моя упрощенная версия того, что вам нужно:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *addition (void *ptr);

struct numbers {
   int num1, num2, res;
};

int main() {
  pthread_t thread[10][10];
  struct numbers num[10][10];

  srand(time(NULL));


  for(int i=0;i<10;i++)
  {
     for(int j=0;j<10;j++)
     {
          num[i][j].num1 = rand() % 100;
          num[i][j].num2 = rand() % 100;

          int ret = pthread_create( &thread[i][j], NULL, addition, 
                        (void *) &num[i][j]);

          if ( ret != 0 )          {
           printf("error creating thread.");
           abort();
          }
     }
  }

  for(int i=0;i<10;i++)
  {
     for(int j=0;j<10;j++)
     {

      if ( pthread_join ( thread[i][j], NULL ) )     {
        printf("error joining thread.");
        abort();
          }
     }
  }

  printf("Results:\n");

  for(int i=0;i<10;i++)
  {
     for(int j=0;j<10;j++)
     {
         printf("%3d ", num[i][j].num1);
     }
     printf("\n");
  }

  printf("\nplus\n");

  for(int i=0;i<10;i++)
  {
     for(int j=0;j<10;j++)
         {
         printf("%3d ", num[i][j].num2);
     }
     printf("\n");
  }

  printf("\nis equal to\n");

  for(int i=0;i<10;i++)
  {
     for(int j=0;j<10;j++)
     {
         printf("%3d ", num[i][j].res);
     }
     printf("\n");
  }

  exit(0);
}

void *addition (void *ptr) {
    struct numbers *my_ptr = (struct numbers *) ptr;
    my_ptr->res = my_ptr->num1 + my_ptr->num2;

    return NULL;
}

//gcc -Wall -std=c99 -lpthread prog.c
...