2016-02-24 3 views
0

Какое обходное решение существует для запуска этого кода? В результате кода «Попытка ссылаться на удаленную функцию». unique_ptr назначается в цикле, а затем передается в поток, а затем освобождается.boost thread_group переместить право собственности на unique_ptr на thread

boost::thread_group threads; 
std::unique_ptr<ScenarioResult> scenario_result; 

while ((scenario_result = scenarioStock.getNextScenario()) != nullptr) 
{ 
threads.create_thread(boost::bind(&Simulation::RunSimulation, boost::ref(grid_sim), std::move(scenario_result))); 
} 
+0

[mcve] поможет много, а также скопирует фактические сообщения об ошибках в вопрос - а не только сокращенную версию, которую вы добавили до сих пор. –

ответ

1

Вы можете использовать лямбда-выражение вместо boost::bind

threads.create_thread([&] { grid_sim.RunSimulation(std::move(scenario_result)); }); 

Проблема с тем, что вы делаете, что create_thread попытки скопировать функтор, bind создает, и это не удается из-за наличия связанный аргумент unique_ptr заставляет функтор двигаться только.

+0

может @Praetorian, пожалуйста, посмотрите на расширение этой проблемы здесь: http://stackoverflow.com/questions/35611780/stdunique-ptr-in-a-loop-memory-leaks – Tims

+0

@Tims Почему вы хотите передать права собственности на 'Результат'' RunSimulation'? Мне кажется, что вам нужен контейнер 'Result', передайте ссылку на каждый из них в поток, а затем просмотрите' Result', когда поток завершит то, что он делает. – Praetorian

+0

Я хотел бы избавиться от результата, как только он будет обработан, а не иметь его в контейнере – Tims