История изменений
Исправление
nanoolinux,
(текущая версия)
:
void PrimeNumbers::initiate_with_async(const unsigned max)
{
unsigned head;
unsigned i;
numbers_.assign(number_to_index(max)+1,1);
vector <future <void> > fs;
for (head=3; head<=max; head+=2) {
if (numbers_[number_to_index(head)]==1) { // Is prime/unchecked yet
if (!is_prime(head)) { // Is not prime
numbers_[number_to_index(head)]=0;
} else { // Is prime
fs.push_back(async(launch::async, &PrimeNumbers::mark_non_prime3, *this, head, max));
}
}
};
for_each(fs.begin(), fs.end(), [] (future <void> &f) {
f.get();
});
};
void PrimeNumbers::mark_non_prime3(const unsigned v,const unsigned max)
{
unsigned n;
n=v*3;
while (n<=max) {
numbers_[number_to_index(n)]=0;
n+=v*2;
}
volatile int i,j; //*
for(i=0;i<10000;i++) //*
for(j=0;j<10000;j++); //*
};
вот такое даёт адское число процессов. если убрать строки со звёздочкой, будет один поток, загружающий одно ядро на 100%. Но это только факты. Я только предполагаю, что анон прав.
п.с. компилил без -O
Исходная версия
nanoolinux,
:
void PrimeNumbers::initiate_with_async(const unsigned max)
{
unsigned head;
unsigned i;
numbers_.assign(number_to_index(max)+1,1);
vector <future <void> > fs;
for (head=3; head<=max; head+=2) {
if (numbers_[number_to_index(head)]==1) { // Is prime/unchecked yet
if (!is_prime(head)) { // Is not prime
numbers_[number_to_index(head)]=0;
} else { // Is prime
fs.push_back(async(launch::async, &PrimeNumbers::mark_non_prime3, *this, head, max));
}
}
};
for_each(fs.begin(), fs.end(), [] (future <void> &f) {
f.get();
});
};
void PrimeNumbers::mark_non_prime3(const unsigned v,const unsigned max)
{
unsigned n;
n=v*3;
while (n<=max) {
numbers_[number_to_index(n)]=0;
n+=v*2;
}
volatile int i,j; //*
for(i=0;i<10000;i++) //*
for(j=0;j<10000;j++); //*
};
вот такое даёт адское число процессов. если убрать строки со звёздочкой, будет один поток, загружающий одно ядро на 100%. Но это только факты. Я только предполагаю, что анон прав.