Взгляните на свою линию
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