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; }