最近になって、boost勉強中
やりこなせ、サンプル数
書き方やっぱりC言語風
ラップも仕事も迷走中
よーちぇけら
#仕事の依頼
出来るだけシンプルに、マルチスレッドワーカーに仕事を依頼したい
WorkerThreadってやつですね。
でも、依頼したい仕事のネタが同じデータなのでshard_ptrなんす
#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
class event_manager {
boost::asio::io_service& io_service_;
boost::shared_ptr<boost::asio::io_service::work> work_;
boost::thread_group group_;
public:
event_manager(boost::asio::io_service& io_service)
: io_service_(io_service)
{
work_.reset(new boost::asio::io_service::work(io_service_));
for (std::size_t i = 0; i < 3; ++i) {
group_.create_thread(boost::bind(&boost::asio::io_service::run, &io_service_));
}
}
void stop()
{
work_.reset();
group_.join_all();
}
~event_manager()
{
stop();
}
};
class Work {
boost::asio::io_service& io_service_;
boost::asio::strand strand_;
std::string name_;
public:
explicit Work(boost::asio::io_service& io_service, const std::string& name)
: io_service_(io_service), strand_(io_service), name_(name) {}
void lets_do(std::shared_ptr<const std::string> msg)
{
io_service_.dispatch(strand_.wrap(boost::bind(&Work::doing, this, msg)));
}
private:
void doing(std::shared_ptr<const std::string> msg)
{
std::cout << "start : " + name_ + " -------" << *msg << std::endl;
boost::this_thread::sleep(boost::posix_time::seconds(2));
std::cout << "end : " + name_ + " =======" << *msg << std::endl;
}
};
int main()
{
boost::asio::io_service io_service;
event_manager manager(io_service);
Work workA(io_service, "[Working A Job]");
Work workB(io_service, "[Working B Job]");
auto pt1 = std::make_shared<std::string>("pt1");
std::cout << "Would you do work?" << std::endl;
workA.lets_do(pt1);
workA.lets_do(pt1);
workB.lets_do(pt1);
workB.lets_do(pt1);
workA.lets_do(pt1);
std::cout << "Sounds good ! pt1 working on thread." << std::endl;
for(int i=0; i<10 ; i++){
auto pt2 = std::make_shared<std::string>("pt:" + std::to_string(i));
workA.lets_do(pt2);
workB.lets_do(pt2);
}
std::cout << "Go it. All work doing." << std::endl;
manager.stop();
}