Я бы хотел использовать boost::asio
для создания пула потоков. Мой вопрос: как я могу прикрепить конкретные данные к каждому из созданных потоков и как я могу управлять отдельными выходами?Использование пула потоков для моделирования: boost-thread и boost-asio
Чтобы быть более конкретным, я написал класс 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
) является не адаптированный к моей проблеме. У вас есть предложения? Спасибо.
Благодарим за ответ. Но я не вижу, как вы используете N экземпляров класса Simulation, чтобы гарантировать, что поток 'i' вычисляет результаты с экземпляром' i' (и поэтому использует свои собственные данные для выполнения работы). Способ борьбы с выходами кажется прекрасным, спасибо! –
@ gleeen.gould Можете ли вы пояснить, почему важно, чтобы вы использовали thread 'i' для вычисления работы для моделирования' i'? Это возможно (вызовите 'thread-> get_id()', когда вы его создадите, передайте это 'simulation [i]', а затем проверьте работу функции моделирования [i] ', когда он будет выполнен, что' boost :: this_thread :: get_id() 'match, if not return, else keep going), но я не думаю, что это необходимо. – Tres
Посмотрите на мое решение, я надеюсь, что это прояснит мои цели. –