Advertisement
STANAANDREY

pthread intervals prime check

Nov 22nd, 2024
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.05 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 LINE_SIZE (1 << 12)
  11.  
  12. static int a, b, n;
  13.  
  14. bool isPrime(int x) {
  15.     if (x < 2) {
  16.         return false;
  17.     }
  18.     if (x == 2) {
  19.         return true;
  20.     }
  21.     for (int div = 2; div * div <= x; div++) {
  22.         if (x % div == 0) {
  23.             return false;
  24.         }
  25.     }
  26.     return true;
  27. }
  28.  
  29. void *routine(void *arg) {
  30.     int *pair = (int*)arg;
  31.     for (int x = pair[0]; x <= pair[1]; x++) {
  32.         if (isPrime(x)) {
  33.             printf("%d\n", x);
  34.         }
  35.     }
  36.     return NULL;
  37. }
  38.  
  39. int main(int argc, char *argv[]) {
  40.     if (argc != 4) {
  41.         fprintf(stderr, "WRONG USAGE!\n");
  42.         exit(1);
  43.     }
  44.  
  45.     a = atoi(argv[1]);
  46.     b = atoi(argv[2]);
  47.     n = atoi(argv[3]);
  48.     if (!a || !b || !n) {
  49.         fprintf(stderr, "WRONG Params!\n");
  50.         exit(1);
  51.     }
  52.  
  53.     cpu_set_t cpuset;
  54.     CPU_ZERO(&cpuset);
  55.     CPU_SET(0, &cpuset);
  56.     CPU_SET(1, &cpuset);
  57.     CPU_SET(2, &cpuset);
  58.  
  59.     pthread_attr_t attr;
  60.     pthread_attr_init(&attr);
  61.     pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpuset);
  62.  
  63.     int nrElems = b - a + 1;
  64.     if (nrElems % n) {
  65.         fprintf(stderr, "WRONG values!\n");
  66.         exit(1);
  67.     }
  68.     int intSize = (nrElems / n);
  69.  
  70.     pthread_t thread[n];
  71.     int pairs[n][2];
  72.     for (int i = 0; i < n; i++) {
  73.         pairs[i][0] = a + i * intSize;
  74.         pairs[i][1] = pairs[i][0] + intSize - 1;
  75.     }
  76.  
  77.     int r = 0;
  78.     for (int i = 0; i < n; i++) {  
  79.         if ((r = pthread_create(&thread[i], &attr, routine, pairs[i])) != 0) {
  80.             fprintf(stderr, "pthread_create: %s\n", strerror(r));
  81.             exit(1);
  82.         }        
  83.     }
  84.  
  85.     for (int i = 0; i < n; i++) {
  86.         if ((r = pthread_join(thread[i], NULL)) != 0) {
  87.             fprintf(stderr, "pthread_join: %s\n", strerror(r));
  88.             exit(1);
  89.         }
  90.     }
  91.  
  92.     pthread_attr_destroy(&attr);
  93.    
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement