Advertisement
STANAANDREY

compute prime nrs in [a;b] pthread

Nov 27th, 2024 (edited)
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.65 KB | None | 0 0
  1. #define _GNU_SOURCE
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <pthread.h>
  5. #include <string.h>
  6. #include <sched.h>
  7. #include <stdbool.h>
  8. #include <unistd.h>
  9.  
  10. #define MAX_LEN (1 << 12)
  11.  
  12. static int a, b, n;
  13.  
  14. static int ans[MAX_LEN], len;
  15.  
  16. pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;;
  17.  
  18. bool isPrime(int x) {
  19.     if (x < 2) {
  20.         return false;
  21.     }
  22.     if (x == 2) {
  23.         return true;
  24.     }
  25.     for (int div = 2; div * div <= x; div++) {
  26.         if (x % div == 0) {
  27.             return false;
  28.         }
  29.     }
  30.     return true;
  31. }
  32.  
  33. void *routine(void *arg) {
  34.     int *pair = (int*)arg;
  35.     for (int r = 0, x = pair[0]; x <= pair[1]; x++) {
  36.         if (isPrime(x)) {
  37.             if ((r = pthread_mutex_lock(&mtx)) != 0) {
  38.                 fprintf(stderr, "pthread_mutex_lock: %s\n", strerror(r));
  39.                 pthread_exit(NULL);
  40.             }
  41.             ans[len++] = x;
  42.             if ((r = pthread_mutex_unlock(&mtx)) != 0) {
  43.                 fprintf(stderr, "pthread_mutex_unlock: %s\n", strerror(r));
  44.                 pthread_exit(NULL);
  45.             }
  46.         }
  47.     }
  48.     return NULL;
  49. }
  50.  
  51. int main(int argc, char *argv[]) {
  52.     if (argc != 4) {
  53.         fprintf(stderr, "WRONG USAGE!\n");
  54.         exit(1);
  55.     }
  56.  
  57.     a = atoi(argv[1]);
  58.     b = atoi(argv[2]);
  59.     n = atoi(argv[3]);
  60.     if (!a || !b || !n) {
  61.         fprintf(stderr, "WRONG Params!\n");
  62.         exit(1);
  63.     }
  64.  
  65.     cpu_set_t cpuset;
  66.     CPU_ZERO(&cpuset);
  67.     CPU_SET(0, &cpuset);
  68.     CPU_SET(1, &cpuset);
  69.     CPU_SET(2, &cpuset);
  70.  
  71.     pthread_attr_t attr;
  72.     pthread_attr_init(&attr);
  73.     pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpuset);
  74.  
  75.     int nrElems = b - a + 1;
  76.     if (nrElems % n) {
  77.         fprintf(stderr, "WRONG values!\n");
  78.         exit(1);
  79.     }
  80.     int intSize = (nrElems / n);
  81.  
  82.     pthread_t thread[n];
  83.     int pairs[n][2];
  84.     for (int i = 0; i < n; i++) {
  85.         pairs[i][0] = a + i * intSize;
  86.         pairs[i][1] = pairs[i][0] + intSize - 1;
  87.     }
  88.  
  89.     int r = 0;
  90.     pthread_mutex_init(&mtx, NULL);
  91.     for (int i = 0; i < n; i++) {  
  92.         if ((r = pthread_create(&thread[i], &attr, routine, pairs[i])) != 0) {
  93.             fprintf(stderr, "pthread_create: %s\n", strerror(r));
  94.             exit(1);
  95.         }        
  96.     }
  97.  
  98.     for (int i = 0; i < n; i++) {
  99.         if ((r = pthread_join(thread[i], NULL)) != 0) {
  100.             fprintf(stderr, "pthread_join: %s\n", strerror(r));
  101.             exit(1);
  102.         }
  103.     }
  104.  
  105.     pthread_attr_destroy(&attr);
  106.     pthread_mutex_destroy(&mtx);
  107.  
  108.     for (int i = 0; i < len; i++) {
  109.         printf("%d ", ans[i]);
  110.     }
  111.     puts("");
  112.  
  113.     return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement