Я пытаюсь распараллелить определенный аспект моей программы, используя boost::threadpool
(не является официальной частью boost
, ссылка ).Тем не менее, я обнаружил, что моя программа зависла, и при проверке htop
показывает, что есть два неактивных потока (я подозреваю, в моем пуле потоков) и один поток, работающий на 100% (я подозреваю, что мой основной поток выполнения).
Вот соответствующий код:
namespace rt {
class Renderer
{
public:
Renderer(int threads) : tp(threads) {}
void render(const Scene&, const Camera&, Image&) const;
private:
mutable boost::threadpool::pool tp;
//int tp;
static void render(const Scene&, const Camera&, Image&, int, int);
static Color trace_ray(const Ray&, const Scene&, int depth = 0);
};
} // namespace rt
void
Renderer::render(const Scene& scene, const Camera& cam, Image& image) const
{
for (int y = 0; y < image.get_height(); ++y)
for (int x = 0; x < image.get_width(); ++x)
tp.schedule(boost::bind(&Renderer::render, scene, cam, image, x, y));
tp.wait();
}
void
Renderer::render(const Scene& scene, const Camera& cam, Image& image, int x, int y)
{
Color c = trace_ray(cam.spawn_ray(x + .25f, y + .25f), scene)
+ trace_ray(cam.spawn_ray(x + .75f, y + .25f), scene)
+ trace_ray(cam.spawn_ray(x + .25f, y + .75f), scene)
+ trace_ray(cam.spawn_ray(x + .75f, y + .75f), scene);
image.set_pixel(x, y, c / 4.0f);
}
Причина, по которой я подозреваю, что проблема заключается в моей конструкции boost::bind
, заключается в том, что когда я создаю функцию void foobar() {}
и передаю ее в boost::threadpool::pool::schedule
программа не попадает в бесконечный цикл.Что я тут не так делаю?