Tutustuin sitten säikeisiin ja kokeilin tällaista ohjelmaa
#include <iostream>
#include <thread>
#include <future>
#include <chrono>
#include <ctime>
long fibonacci(unsigned n)
{
if (n < 2) return n;
return fibonacci(n-1) + fibonacci(n-2);
}
void initiazer(std::promise<int> *promObj, long val, int n)
{
std::cout<<"ollaan säikeessä " << n <<std::endl;
promObj->set_value(fibonacci(val));
}
int main()
{
std::chrono::time_point<std::chrono::system_clock> start, end;
start = std::chrono::system_clock::now();
std::promise<int> promiseObj1;
std::future<int> futureObj1 = promiseObj1.get_future();
std::thread th1(initiazer, &promiseObj1, 42, 1);
std::promise<int> promiseObj2;
std::future<int> futureObj2 = promiseObj2.get_future();
std::thread th2(initiazer, &promiseObj2, 42, 2);
std::promise<int> promiseObj3;
std::future<int> futureObj3 = promiseObj3.get_future();
std::thread th3(initiazer, &promiseObj3, 42, 3);
std::cout<<futureObj1.get()<<std::endl;
std::cout<<futureObj2.get()<<std::endl;
std::cout<<futureObj3.get()<<std::endl;
th1.join();
th2.join();
th3.join();
end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end-start;
std::time_t end_time = std::chrono::system_clock::to_time_t(end);
std::cout << "finished computation at " << std::ctime(&end_time)
<< "elapsed time: " << elapsed_seconds.count() << "s\n";
return 0;
}
Ohjelmassa käynnistetään kolme säiettä, joissa jokaisessa on edellisen kerran fibonacci-laskenta.
Pari kysymystä tuli esille.
Miksi promise<long> ei käänny, vaikka yritän plauttaa fibonacci() :n long arvon.
Toinen kysymys on, miksi näiden kolmen säikeen suorittamien kestää noin 3 kertaa kauemmin kuin tavallisen fibonacci-ohjelman suorittaminen. Jos tavalliseen fibonacciin menee noin 2 sekuntia ilman optimointeja, kestää näiden 3 säikeen suorittaminen noin 6 sekuntia. Muistaakseni kahden säikeen suorittamien kesti noin 4 sekuntia.
Pitäisikö käyttää joitain erikoisvalitsimia käännettäessä. Nyt näyttää siltä, että en ole onnistunut säikeistämään ohjelmaa yhtään.