Advertisement
Guest User

Untitled

a guest
Dec 13th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.94 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include <time.h>
  5. //gcc -std=c99 POSIX72.c -lpthread -o pos2.exe
  6. #define SIZE 7
  7.  
  8. #define N 7
  9.  
  10. typedef struct {
  11.     int** arr;
  12.     int lB, uB;
  13.     int n;
  14. } dataStr;
  15.  
  16. pthread_mutex_t mutex[N];
  17. pthread_barrier_t barrier;
  18.  
  19.  
  20. void shiftDr(int** arr, int lB, int uB){
  21.     int i,j,t;
  22.     for(i = lB; i <= uB ; ++i){
  23.         t = arr[SIZE-1][i];
  24.         for(j = SIZE-1; j > 0; --j)
  25.             arr[j][i] = arr[j-1][i];
  26.         arr[j][i] = t;
  27.     }
  28. }
  29.  
  30. void shiftRr(int** matrix, int lB, int uB, int n){
  31.     int i,j,t;
  32.     int* tmp = (int*)malloc(SIZE * sizeof(int));
  33.     for(i = 0; i < SIZE; ++i){
  34.         tmp[i] = matrix[i][uB];
  35.         for(j = uB; j>lB; --j)
  36.             matrix[i][j] = matrix[i][j-1];
  37.     }
  38.     pthread_mutex_unlock(&mutex[n]);
  39.     pthread_barrier_wait(&barrier);
  40.     pthread_mutex_lock(&mutex[(n+1)%N]);
  41.     for (i = 0; i < SIZE; ++i)
  42.         matrix[i][(uB+1)%SIZE] = tmp[i];
  43.      pthread_mutex_unlock(&mutex[(n+1)%N]);
  44. }
  45.  
  46. void* threadF(void* thread_data){
  47.     dataStr *data = (dataStr*) thread_data;
  48.     shiftDr(data->arr, data->lB, data->uB);
  49.     pthread_mutex_lock(&mutex[data->n]);
  50.     shiftRr(data->arr, data->lB, data->uB, data->n);
  51.     return NULL;
  52. }
  53.  
  54. void makeMatr(int** arr){
  55.     int i, j;
  56.     for (i = 0; i < SIZE; ++i){
  57.         arr[i] = (int*)malloc(SIZE * sizeof(int));
  58.     for (j = 0; j < SIZE; ++j)
  59.         arr[i][j] = (j+i) % 10;
  60.     }
  61. }
  62.  
  63. int main(){
  64.     double time;
  65.  
  66.     pthread_t* threads = (pthread_t*) malloc(N * sizeof(pthread_t));
  67.  
  68.     dataStr* threadData = (dataStr*) malloc(N * sizeof(dataStr));
  69.  
  70.     int** matrix = (int**)malloc(SIZE * sizeof(int*));
  71.     makeMatr(matrix);
  72.  
  73.     for(int i = 0; i< SIZE; ++i){
  74.         for(int j = 0; j <SIZE; ++j)
  75.             printf("%d ",matrix[i][j]);
  76.         printf("\n");
  77.     }
  78.  
  79.     pthread_barrier_init(&barrier, NULL, N);
  80.  
  81.     for(int i = 0; i<N; ++i)
  82.         pthread_mutex_init(&mutex[i], NULL); //Защищает первый столбик своего диапазона
  83.  
  84.     int lB = 0, uB = SIZE-1;
  85.     int step = uB / N;
  86.  
  87.     clock_t start = clock();
  88.  
  89.     for(int q = 0; q < N; ++q){
  90.         threadData[q].lB = lB;
  91.     if (q!=N-1){
  92.         threadData[q].uB = lB+=step;
  93.         ++lB;
  94.     }
  95.     else
  96.         threadData[q].uB = uB;
  97.     threadData[q].n = q;
  98.     threadData[q].arr = matrix;
  99.     pthread_create(&(threads[q]), NULL, threadF, &threadData[q]);
  100.     }
  101.  
  102.     for(int q = 0; q < N; ++q)
  103.     pthread_join(threads[q], NULL);
  104.     time = (clock() - start)/CLOCKS_PER_SEC;
  105.     printf("\n Time of work: %f \n", time);
  106.  
  107.     pthread_barrier_destroy(&barrier);
  108.     free(threads);
  109.     free(threadData);
  110.  
  111.     printf("\n\n");
  112.  
  113.    for (int i = 0; i < SIZE; ++i){
  114.         for(int j = 0; j<SIZE; ++j)
  115.             printf("%d ",matrix[i][j]);
  116.         printf("\n");
  117.     }
  118.  
  119.     for(int i = 0; i < SIZE; ++i)
  120.         free(matrix[i]);
  121.     free(matrix);
  122.    return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement