Хорошая попытка;Тем не менее, я рекомендую делать небольшие шаги и собирать часто, чтобы не погрузиться слишком глубоко в состояние растерянности.Как только вы увидите ошибку, исправьте ее, прежде чем двигаться дальше.
Учитывая ваш вариант использования (пользовательский ввод), я рекомендую использовать динамическое выделение памяти.Таким образом, пользователь может указать матрицу любого размера (а также любое количество потоков).Во-вторых, поскольку потоки принимают только один аргумент, кажется идеальным инкапсулировать свойства матрицы в структуру.Должно быть поле указателя на данные, а также записи для строк и столбцов, которые могут быть определены пользователем с использованием (более или менее) вашего текущего входного кода.
После того, как структура аргумента передана в рабочую функцию, вам нужно привести ее к нужному типу.Будьте осторожны при изменении общих данных здесь!Вы можете добавить блокировку мьютекса или семафор в структуру матрицы, если несколько потоков будут пытаться изменить его одновременно.
Вот подтверждение концепции:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct matrix {
int rows;
int cols;
int **data;
} matrix;
void *maxthread(void *arg) {
matrix m = *((matrix *)arg);
for (int i = 0; i < m.rows; i++) {
for (int j = 0; j < m.cols; j++) {
printf("[%2d]", m.data[i][j]);
}
puts("");
}
puts("");
return NULL;
}
int main() {
int num_threads = 3; // or take user input
pthread_t threads[num_threads];
matrix m;
m.rows = 11; // or take user input
m.cols = 8;
m.data = malloc(sizeof(int *) * m.rows);
for (int i = 0; i < m.rows; i++) {
m.data[i] = malloc(sizeof(int) * m.cols);
for (int j = 0; j < m.cols; j++) {
m.data[i][j] = i * j;
}
}
for (int i = 0; i < num_threads; i++) {
pthread_t thread;
pthread_create(&thread, NULL, maxthread, &m);
threads[i] = thread;
}
for (int i = 0; i < num_threads; i++) {
pthread_join(threads[i], NULL);
}
for (int i = 0; i < m.rows; i++) {
free(m.data[i]);
}
free(m.data);
return 0;
}
Вывод может быть чем-то вроде:
[ 0][ 0][ 0][ 0][ 0][ 0][ 0][ 0]
[ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7]
[ 0][ 2][ 4][ 6][ 8][10][12][14]
[ 0][ 3][ 6][ 9][12][15][18][21]
[ 0][ 4][ 8][12][16][20][24][28]
[ 0][ 5][10][15][20][25][30][35]
[ 0][ 6][12][18][24][30][36][42]
[ 0][ 7][14][21][28][35][42][49]
[ 0][ 8][16][24][32][40][48][56]
[ 0][ 9][18][27][36][45][54][63]
[ 0][10][20][30][40][50][60][70]
[ 0][ 0][ 0][ 0][ 0][ 0][ 0][ 0]
[ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7]
[ 0][ 2][ 4][ 6][ 8][10][12][14]
[ 0][ 3][ 6][ 9][12][15][18][21]
[ 0][ 4][ 8][12][16][20][24][28]
[ 0][ 5][10][15][20][25][30][35]
[ 0][ 6][12][18][24][30][36][42]
[ 0][ 7][14][21][28][35][42][49]
[ 0][ 8][16][24][32][40][48][56]
[ 0][ 9][18][27][36][45][54][63]
[ 0][10][20][30][40][50][60][70]
[ 0][ 0][ 0][ 0][ 0][ 0][ 0][ 0]
[ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7]
[ 0][ 2][ 4][ 6][ 8][10][12][14]
[ 0][ 3][ 6][ 9][12][15][18][21]
[ 0][ 4][ 8][12][16][20][24][28]
[ 0][ 5][10][15][20][25][30][35]
[ 0][ 6][12][18][24][30][36][42]
[ 0][ 7][14][21][28][35][42][49]
[ 0][ 8][16][24][32][40][48][56]
[ 0][ 9][18][27][36][45][54][63]
[ 0][10][20][30][40][50][60][70]