Я написал многопоточную программу, используя обещания и фьючерсы, чтобы проверить, является ли заданное число простым. Правильность или эффективность этой программы не является точкой, а фактом ошибки сегментации, которая возникает при каждом выполнении - у меня была аналогичная проблема с более сложной программой, поэтому я написал этот простой, чтобы понять ее, и ошибка все еще Вот. Может быть, я не понимаю что-то о параллелизме или обещаниях/фьючерсах, но я думаю, что все сделано здесь надлежащим образом ... Может кто-нибудь объяснить, почему он не работает? Было бы очень полезно :)Ошибка сегментации с использованием массива обещаний
Вот код:
#include <future>
#include <thread>
#include <iostream>
#include <initializer_list>
#include <vector>
#include <cassert>
namespace {
const int THREADS_NUMBER = 8;
void f(int n, std::vector<int>& divisiors, std::promise<bool>& isPossiblePrime) {
bool isPrimeCandidate = true;
for (auto i : divisiors)
if (n % i == 0) {
isPrimeCandidate = false;
break;
}
isPossiblePrime.set_value(isPrimeCandidate);
}
}
int main() {
int n;
std::cin >> n;
assert(n > 2);
std::promise<bool> promises[THREADS_NUMBER];
std::future<bool> futures[THREADS_NUMBER];
for (int i = 0; i < n; i++)
futures[i] = promises[i].get_future();
std::thread threads[THREADS_NUMBER];
std::vector<int> divisiors[THREADS_NUMBER];
for (int i = 2; i < n; i++)
divisiors[i % THREADS_NUMBER].push_back(i);
for (int i = 0; i < THREADS_NUMBER; i++)
threads[i] = std::thread{ [&]() { f(n, divisiors[i], promises[i]); }};
bool isPrime = true;
for(auto & f : futures) {
bool out = f.get();
isPrime = out && isPrime;
}
for (auto& t : threads)
t.join();
if(isPrime) std::cout << "PRIME" << std::endl;
else std::cout << "NOT PRIME" << std::endl;
}
компилировать с g++ -std=c++11 -Wall -lpthread
на Linux.
Большое спасибо, я бы никогда не узнал его сам (на самом деле я трачу около 8 часов на эту проблему и никаких эффектов). Я никогда не использовал лямбда на C++, но они выглядели довольно прямолинейно для меня, поэтому я был Я думал, что это может быть проблема :) Спасибо снова! – sadida
@sadida мне потребовалось много времени, чтобы выяснить, что происходит! –