我想使用boost::asio来设置一个线程池。
我的问题是:如何将特定的数据附加到创建的每个线程上,以及如何管理各自的输出?
更具体地说,我编写了一个名为Simulation的类,通过一种方法来执行模拟并输入一些参数。 这个类包含了所有需要进行计算的数据。 由于数据不太大,我希望在池的每个线程中使用Simulation类的不同实例来复制它。
我想做这样的事情: (设置线程池的方法在此处解释:SO和Asio recipes)
也许我设置线程池的技术(使用
更具体地说,我编写了一个名为Simulation的类,通过一种方法来执行模拟并输入一些参数。 这个类包含了所有需要进行计算的数据。 由于数据不太大,我希望在池的每个线程中使用Simulation类的不同实例来复制它。
我想做这样的事情: (设置线程池的方法在此处解释:SO和Asio recipes)
class ParallelSimulation
{
public:
static const std::size_t N = 10;
protected:
std::vector< boost::shared_ptr<Simulation> > simuInst; // N copy of a reference instance.
public:
...
// Simulation with a large (>>N) number of inputs
void eval( std::vector< SimulationInput > inputs )
{
// Creation of the pool using N threads
asio::io_service io_service;
asio::io_service::work work(io_service);
boost::thread_group threads;
for (std::size_t i = 0; i < N; ++i)
threads.create_thread(boost::bind(&asio::io_service::run, &io_service));
// Here ? Attaching the duplicates instances of class Simulation ?
// Adding tasks
for( std::size_t i = 0, i_end = inputs.size(); i<i_end; ++i)
io_service.post(...); // add simulation with inputs[i] to the queue
// How to deal with outputs ?
// End of the tasks
io_service.stop();
threads.join_all();
}
};
也许我设置线程池的技术(使用
boost::asio
)不适合我的问题。你有什么建议吗?
谢谢。
i
来计算模拟i
的工作很重要吗?这是可能的(在创建线程时调用thread->get_id()
,将其传递给simulation[i]
,然后让simulation[i]
的工作函数在执行时检查boost::this_thread::get_id()
是否匹配,如果不匹配则返回,否则继续执行),但我认为这并不是必要的。 - Tres