Każdy z obiektów Data w kolekcji Out jest tworzony wykorzystując stan systemu podczas obsługi zdarzenia zegara.
Kolekcja Out nie jest używana zanim nie zostanie uzupełniona.
Dostarczone rozwiązanie jest mało wydajne. Spróbuj poprawić kod funkcji serve_event.
W zadaniu wykorzystujemy funkcje anonimowe w C++, zwane także funkcjami lambda.
Kod [&](const boost::system::error_code& error){ serve_event(out, t, error); }
tworzy 1 argumentową funkcję anonimową, argument jest typu const boost::system::error_code&, wołanie tej funkcji sprawi, że zostanie wywołana funkcja
serve_event z argumentami out, t i error.
#include <vector>
#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace std;
class Data {}; //nie zamieszczono skladowych
using PData = shared_ptr<Data>;
struct Out {
Out(int size) : size_(size) {}
int size_;
std::vector<PData> v_;
mutex m_;
};
void serve_event( Out& out, boost::asio::deadline_timer& t, const boost::system::error_code& error) {
if( error ) return;
lock_guard<mutex> guard(out.m_);
PData data = PData(new Data()); //tworzenie paczki danych, nie ma dużych kosztów obliczeniowych, tego nie poprawiamy
out.v_.push_back(data);
if(out.v_.size() < out.size_) {
t.async_wait([&](const boost::system::error_code& error){ serve_event(out, t, error); });
}
}
int main() {
Out out(500);
boost::asio::io_service io;
boost::asio::deadline_timer t1(io, boost::posix_time::milliseconds(8) );
boost::asio::deadline_timer t2(io, boost::posix_time::milliseconds(13) );
boost::asio::deadline_timer t3(io, boost::posix_time::milliseconds(21) );
boost::asio::deadline_timer t4(io, boost::posix_time::milliseconds(34) );
boost::asio::deadline_timer t5(io, boost::posix_time::milliseconds(55) );
t1.async_wait([&](const boost::system::error_code& error){ serve_event(out, t1, error);});
t2.async_wait([&](const boost::system::error_code& error){ serve_event(out, t2, error);});
t3.async_wait([&](const boost::system::error_code& error){ serve_event(out, t3, error);});
t4.async_wait([&](const boost::system::error_code& error){ serve_event(out, t4, error);});
t5.async_wait([&](const boost::system::error_code& error){ serve_event(out, t5, error);});
io.run();
return 0;
}