У меня есть простая программа, которая вычисляет лемуан n (и минимизирует p) для всех n в диапазоне.Я пытаюсь использовать boost :: thread_group для выполнения заданий с использованием определенного числа ядер.Вот мой код:
int is_prime(unsigned int number)
{
if (number <= 1) return 0;
unsigned int i;
for (i=2; i*i<=number; i++) {
if (number % i == 0) return 0;
}
return 1;
}
void lemoine(unsigned int n)
{
unsigned int q, p;
for (q = n/2; q > 0; q--) {
p = n - 2 * q;
if (is_prime(p) && is_prime(q)) {
printf("%d = %d + 2*%d\n", n, p, q);
return;
}
}
}
void guess(unsigned int lower, unsigned int upper, unsigned int cores)
{
unsigned int n;
boost::asio::io_service svc;
boost::asio::io_service::work work(svc);
boost::thread_group threadpool;
for (int i = 0; i < cores; i++) {
threadpool.create_thread(boost::bind(&boost::asio::io_service::run, &svc));
}
for (n = lower; n <= upper; n+=2) {
svc.post(std::bind(lemoine, n));
}
threadpool.join_all();
}
Я собрал это вместе с различными примерами, найденными онлайн.Проблема в threadpool.join_all () никогда не возвращается.По распечатке я вижу, что все мои работы выполнены, но все равно зависает.Один пример, который я нашел, предлагает выполнить svc.stop () перед объединением, но это делает вывод непредсказуемым, поскольку он явно убивает задания до их завершения (а не ожидает их завершения).Как я могу обеспечить выполнение всех заданий и поручиться за них?