Advertisement
Guest User

Kombinačné čísla

a guest
Dec 7th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.40 KB | None | 0 0
  1. #include <pthread.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5.  
  6. #define BUFFER_SIZE 20
  7. #define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
  8. #define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
  9.  
  10. struct pair
  11. {
  12.     unsigned number1;
  13.     unsigned number2;
  14. };
  15.  
  16. struct shared_data
  17. {  
  18.     unsigned a;
  19.     unsigned b;
  20.     unsigned n;
  21.  
  22.     volatile struct pair* pairs;  
  23.     volatile unsigned current;
  24.  
  25.     pthread_mutex_t* mutex;
  26.     pthread_cond_t* condConsumer;
  27. };
  28.  
  29. struct pair generate_pair(unsigned a, unsigned b)
  30. {
  31.     struct pair couple;
  32.    
  33.     unsigned modulo = b - a + 1;
  34.     couple.number1 = rand() % modulo + 1;
  35.     couple.number2 = rand() % modulo + 1;
  36.  
  37.     return couple;
  38. }
  39.  
  40. void* gen_pair_numbers(void* tdata)
  41. {
  42.     struct shared_data* data = (struct shared_data*) tdata;
  43.     printf("START OF GENERATING PAIRS THREAD\n");
  44.  
  45.     int i = 0;
  46.     while (i < data->n)
  47.     {
  48.         struct pair couple = generate_pair(data->a, data->b);
  49.  
  50.         pthread_mutex_lock(data->mutex);
  51.         if (data->current < BUFFER_SIZE)
  52.         {
  53.             data->pairs[data->current++] = couple;
  54.             i++;
  55.         }
  56.  
  57.         if (data->current >= BUFFER_SIZE || i >= data->n)
  58.         {
  59.             pthread_cond_signal(data->condConsumer);
  60.         }
  61.         pthread_mutex_unlock(data->mutex);
  62.     }
  63.  
  64.     printf("END OF GENERATING PAIRS THREAD\n");
  65.     return NULL;
  66. }
  67.  
  68. unsigned factorial(unsigned number)
  69. {
  70.     return number < 2 ? 1 : number * factorial(number - 1);
  71. }
  72.  
  73. unsigned calculate_combination(struct pair couple)
  74. {
  75.     unsigned min = MIN(couple.number1, couple.number2);
  76.     unsigned max = MAX(couple.number1, couple.number2);
  77.  
  78.     return factorial(max)/(factorial(min) * factorial(max - min));
  79. }
  80.  
  81. int main(int argc, char** argv)
  82. {
  83.     if (argc < 4)
  84.     {
  85.         printf("Wrong number of parameters.\n");
  86.         printf("Neccessary parameters:\n");
  87.         printf("  a - low bound of interval\n");
  88.         printf("  b - high bound of interval\n");
  89.         printf("  n - number of combinations\n");
  90.  
  91.         return EXIT_FAILURE;
  92.     }
  93.  
  94.     pthread_mutex_t mutex;
  95.     pthread_mutex_init(&mutex, NULL);
  96.  
  97.     pthread_cond_t condConsumer;
  98.     pthread_cond_init(&condConsumer, NULL);
  99.  
  100.     unsigned a = atoi(argv[1]);
  101.     unsigned b = atoi(argv[2]);
  102.     unsigned n = atoi(argv[3]);
  103.  
  104.     struct shared_data data = {
  105.         a,
  106.         b,
  107.         n,
  108.         (struct pair*) malloc(BUFFER_SIZE * sizeof(struct pair)),
  109.         0,
  110.         &mutex,
  111.         &condConsumer
  112.     };
  113.  
  114.     pthread_t generate_thread;
  115.     pthread_create(&generate_thread, NULL, &gen_pair_numbers, &data);
  116.  
  117.     // Implementation
  118.     int i = 0;
  119.  
  120.     while (i < data.n)
  121.     {
  122.         pthread_mutex_lock(&mutex);
  123.         while (data.current == 0)
  124.         {
  125.             pthread_cond_wait(&condConsumer, &mutex);
  126.         }
  127.         pthread_mutex_unlock(&mutex);
  128.  
  129.         pthread_mutex_lock(&mutex);
  130.         struct pair couple = data.pairs[--(data.current)];
  131.         //printf("current: %u\n", data.current);
  132.         pthread_mutex_unlock(&mutex);
  133.        
  134.         i++;
  135.         unsigned result = calculate_combination(couple);
  136.         printf("%d: comb(%u, %u) = %u\n", i, couple.number1, couple.number2, result);
  137.     }
  138.  
  139.     pthread_join(generate_thread, NULL);
  140.     pthread_cond_destroy(&condConsumer);
  141.     pthread_mutex_destroy(&mutex);
  142.     free((void*) data.pairs);
  143.  
  144.     return EXIT_SUCCESS;
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement