Advertisement
Guest User

Untitled

a guest
Sep 30th, 2016
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.44 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <pthread.h>
  4. #include <cmath>
  5. #include <semaphore.h>
  6.  
  7. using namespace std;
  8.  
  9. struct ArgThread {
  10.     long start;
  11.     long end;
  12.     sem_t *semaphore; // Передаём указатель на семафор каждому потоку
  13. };
  14.  
  15. bool is_execellent_number(long number)
  16. {
  17.     vector<long> deliteli;
  18.     for (int i = 1; i <= number / 2; i++)
  19.     {
  20.         if (number % i == 0)
  21.         {
  22.             deliteli.push_back(i);
  23.         }
  24.     }
  25.     long summa = 0;
  26.     for (long i : deliteli)
  27.         summa += i;
  28.     return summa == number;
  29. }
  30.  
  31. void *find(void *arg)
  32. {
  33.     ArgThread *a = (ArgThread *) arg;//приводим arg к типу argthread и записываем это в переменную а
  34.     sem_wait(a->semaphore); // отнимаем от семафора единицу, если счетчика недостаточно - ждём
  35.     for (long i = a->start; i < a->end; i++)
  36.     {
  37.         if (is_execellent_number(i))
  38.         {
  39.             cout << "Найдено совершенное число " << i << endl;
  40.         }
  41.     }
  42.     sem_post(a->semaphore); // Добавляем к семафору единицу
  43.     return 0;
  44. }
  45.  
  46. int main(int argc, char *argv[])
  47. {
  48.     size_t N, threads, sem_threads;
  49.     string str;
  50.     cout << "Введите N: ";
  51.     cin >> N;
  52.  
  53.     cout << endl << "Сколько будет использоваться потоков? ";
  54.     cin >> threads;
  55.  
  56.     cout << endl << "Сколько потоков будет работать одновременно? ";
  57.     cin >> sem_threads;
  58.  
  59.     size_t start = (size_t) pow(10, N - 1);
  60.     size_t end = (size_t) pow(10, N) - 1;
  61.     size_t count = end - start;
  62.     size_t part = (size_t) ceil((double) count / threads);
  63.  
  64.     vector<pthread_t> pthreads(threads);
  65.  
  66.     sem_t *semaphore = new sem_t; // создаём семафор
  67.     sem_init(semaphore, 0, (unsigned int) sem_threads); // инициализируем его
  68.  
  69.     for (int i = 0; i < threads; i++)
  70.     {
  71.         ArgThread *arg = new ArgThread;
  72.         arg->start = i * part + start;
  73.         arg->end = min(arg->start + part, end);
  74.         arg->semaphore = semaphore; // передаём указатель
  75.         pthread_t &thread = pthreads[i];
  76.         pthread_create(&thread, 0, find, arg);
  77.     }
  78.     for (int i = 0; i < threads; i++)
  79.     {
  80.         pthread_join(pthreads[i], 0);
  81.     }
  82.     return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement