#include #include #include struct dane { double *tab, *maksimum; int dlugosc; pthread_mutex_t *rygiel; }; typedef struct dane Dane; void *obsluga(void *x) { Dane *a = (Dane *)x; int i; double *wynik = (double *)malloc(sizeof(double)); *wynik = a->tab[0]; for (i = 1; i < a->dlugosc; i++) if (*wynik < a->tab[i]) *wynik = a->tab[i]; pthread_mutex_lock(a->rygiel); if (*(a->maksimum) < *wynik) *(a->maksimum) = *wynik; pthread_mutex_unlock(a->rygiel); free(a); return (void *)wynik; } int main(int argc, char **argv) { int m = atoi(argv[1]), n, i, j; double **tablica, *pomoc, wynik; pthread_t *watki; pthread_mutex_t kontrola = PTHREAD_MUTEX_INITIALIZER; Dane *y; sscanf(argv[2], "%d", &n); tablica = (double **)malloc(sizeof(double *) * m); watki = (pthread_t *)malloc(sizeof(pthread_t) * m); tablica[0] = (double *)malloc(sizeof(double) * m * n); for (i = 1; i < m; i++) tablica[i] = &(tablica[0][i * n]); srand(time(NULL)); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { tablica[i][j] = (rand() % 1000) / 77; printf("[%d][%d]=%lf ", i, j, tablica[i][j]); } printf("\n"); } wynik = tablica[0][0]; for (i = 0; i < m; i++) { y = (Dane *)malloc(sizeof(Dane)); y->dlugosc = n; y->tab = tablica[i]; y->maksimum = &wynik; y->rygiel = &kontrola; pthread_create(&(watki[i]), NULL, obsluga, (void *)y); } for (i = 0; i < m; i++) { pthread_join(watki[i], (void **)&pomoc); free(pomoc); } printf("Wynik %lf.\n", wynik); free(tablica[0]); free(watki); free(tablica); return 0; }