Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <pthread.h>
- #include <cmath>
- #include <semaphore.h>
- using namespace std;
- struct ArgThread {
- long start;
- long end;
- sem_t *semaphore; // Передаём указатель на семафор каждому потоку
- };
- bool is_execellent_number(long number)
- {
- vector<long> deliteli;
- for (int i = 1; i <= number / 2; i++)
- {
- if (number % i == 0)
- {
- deliteli.push_back(i);
- }
- }
- long summa = 0;
- for (long i : deliteli)
- summa += i;
- return summa == number;
- }
- void *find(void *arg)
- {
- ArgThread *a = (ArgThread *) arg;//приводим arg к типу argthread и записываем это в переменную а
- sem_wait(a->semaphore); // отнимаем от семафора единицу, если счетчика недостаточно - ждём
- for (long i = a->start; i < a->end; i++)
- {
- if (is_execellent_number(i))
- {
- cout << "Найдено совершенное число " << i << endl;
- }
- }
- sem_post(a->semaphore); // Добавляем к семафору единицу
- return 0;
- }
- int main(int argc, char *argv[])
- {
- size_t N, threads, sem_threads;
- string str;
- cout << "Введите N: ";
- cin >> N;
- cout << endl << "Сколько будет использоваться потоков? ";
- cin >> threads;
- cout << endl << "Сколько потоков будет работать одновременно? ";
- cin >> sem_threads;
- size_t start = (size_t) pow(10, N - 1);
- size_t end = (size_t) pow(10, N) - 1;
- size_t count = end - start;
- size_t part = (size_t) ceil((double) count / threads);
- vector<pthread_t> pthreads(threads);
- sem_t *semaphore = new sem_t; // создаём семафор
- sem_init(semaphore, 0, (unsigned int) sem_threads); // инициализируем его
- for (int i = 0; i < threads; i++)
- {
- ArgThread *arg = new ArgThread;
- arg->start = i * part + start;
- arg->end = min(arg->start + part, end);
- arg->semaphore = semaphore; // передаём указатель
- pthread_t &thread = pthreads[i];
- pthread_create(&thread, 0, find, arg);
- }
- for (int i = 0; i < threads; i++)
- {
- pthread_join(pthreads[i], 0);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement