Войти
ПрограммированиеФорумОбщее

Thread Pool без пересоздания тредов в C++

Страницы: 1 2 Следующая »
#0
17:23, 5 ноя. 2019

Хочу реализовать тред-пул, который постоянно держал бы в памяти воркеры. Когда нам нужно посчитать что-то в другом треде, мы просто просим пул и он кидает задачу в первый свободный воркер.

Идея в том, чтобы не создавать новые треды каждый раз, когда у нас появляется новая задача, а использовать уже имееющийся. И тем самым экономить время (ну например, разбить на треды апдейт всех GameEntity и обработать их массив кусочками в разных тредах). Такое будет выполняться 60 раз в секунду и не хотелось бы терять время на подготовку треда и аллокейт памяти.

Возможно как-то в std::thread изменить выполняемую функцию, чтобы поменять текущую задачу и переиспользовать тред?

Или как это правильно реализуется?


#1
17:27, 5 ноя. 2019
+ Показать
#2
17:43, 5 ноя. 2019

lookid
Спасибо, вроде то, что надо. А если нужно передавать функции с разными сигнатурами? std::bind?

#3
17:48, 5 ноя. 2019

А ещё такой вопрос. Как понять, что функция завершилась и можно забрать результат. Ну, например, обновляем физику. Передал воркерам указатель на массив компонентов и индексы начала и конца обрабатываемых частей. Теперь нужно дождаться окончания обработки и начать рендеринг. В обычном треде я бы вызвал join(). А как быть в случае пула?

#4
(Правка: 17:55) 17:55, 5 ноя. 2019

Robotex
std::package_task передаёшь пулу, а дожидаешься std::future::get()

#5
20:32, 5 ноя. 2019

maks242
> std::package_task передаёшь пулу,
А как передавать таски с разными сигнатурами?

#6
21:18, 5 ноя. 2019

Robotex
обёртка над std::package_task + кортеж

#7
22:52, 5 ноя. 2019

Robotex
https://fabiensanglard.net/doom3_bfg/threading.php

#8
23:11, 5 ноя. 2019

0xc0de
Оставь этот бред для своего движка)))

#9
23:56, 5 ноя. 2019

Robotex
> и не хотелось бы терять время на подготовку треда и аллокейт памяти.
Самое тяжелое в тредах, это контекст свитч, на это уходит несколько мс.

#10
2:58, 6 ноя. 2019

Robotex
> В обычном треде я бы вызвал join(). А как быть в случае пула?

Пул живет своей жизнью в очередь которого кидаешь таски на обработку, каждый поток имеет статус выполнения, чтобы завершить работу пула ему нужно дать команду, после которой потоки дорабатывают очередь задач и всё завершается.
Посмотрел свой велосипед пула это две тыcячи строк кода на С++.

#11
3:03, 6 ноя. 2019

gamedevfor
Гавнакода или реально хороший?

#12
3:06, 6 ноя. 2019

lookid
> Гавнакода или реально хороший?
Судя по его описанию принципа работы, вынужден буду тебя огорчить.

#13
3:08, 6 ноя. 2019

maks242
> Судя по его описанию принципа работы, вынужден буду тебя огорчить.

а что не так?

#14
3:09, 6 ноя. 2019

lookid
> Гавнакода или реально хороший?

с потоками красиво не получается, чем ближе код к системе тем ужаснее код - это закономерность.

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее