Я пытаюсь использовать простой пример пула потоков из книги Энтони Уильямса «Параллельность C++ в действии». Я даже нашел здесь код (класс thread_pool) в одном из сообщений: Synchronizing tasks , но у меня другой вопрос. Я хотел бы представить задачу (функция-член) в очереди со следующей подписью:C++ 11 thread pool - задачи с входными параметрами
class A;
class B;
bool MyClass::Func(A*, B*);
Как бы мне нужно изменить thread_pool класс, или как я могу упаковать функции в некоторой пустоте F(), который предполагается использовать в качестве примера в этом примере? Вот наиболее соответствующая часть класса для меня (подробности смотрите по ссылке выше):
class thread_pool
{
thread_safe_queue<std::function<void()> work_queue; // bool MyClass::Func(a,b) ??
void worker_thread() {
while(!done) {
std::function<void()> task;
if(work_queue.try_pop(task)) {
task(); // how should my function MyClass::Func(a,b) be called here?
}
else {
std::this_thread::yield();
}
}
}
// -- Submit a task to the thread pool
template <typename FunctionType>
void submit(FunctionType f) {
work_queue.push(std::function<void()>(f)); // how should bool MyClassFunc(A*, B*) be submitted here
}
}
И, наконец, как я могу назвать представить функцию в моем коде?
Большое спасибо за вашу помощь (к сожалению, я еще не очень опытен в использовании всех возможностей C++ 11, что, вероятно, также объясняет, почему мне нужна помощь здесь, но ответ на этот вопрос должен был бы начать с :)).
Мне интересно, какой контроль над ссылками при использовании связующего ... Вкладыши всегда хранят копии оригинального типа (это необходимо для работы)? В этом случае у вас есть небольшое снижение производительности при дублировании, но это хорошее решение да. –
@WernerErasmus 'std :: bind', а также лямбда-захват копируют свои аргументы. Если вы хотите хранить ссылки, вы должны сделать это явным путем захвата по ссылке '[& a, & b]() {}' или используя 'std :: bind (f, std :: ref (a), std :: ref (b)). – Jens
Копирование - это безопасный вариант, но есть также случай, когда вы не используете bind (как и я), хотя это может быть преждевременная оптимизация. Тем не менее, этот тип кода будет использоваться «в целом», и поэтому может потребоваться оптимизация для непредвиденного (например, большого аргумента). –