boost::threadpool
(boost
、linkの正式な部分ではありません)を使用してプログラムの特定の側面を並列化しようとしています。しかし、私はプログラムの停止と点検時に、htop
は2つの非アクティブなスレッド(私はスレッドプールにあると思われます)と1つのスレッドが100%で実行されていることを示しています(私の主な実行スレッドと思われます)。ここでboost :: threadをboost :: bindで使用すると、無限ループでプログラムがハングします
は、関連するコードです:
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
にそれを渡したときに、プログラムが取得していないということです無限ループに入ります。私はここで間違って何をしていますか?
問題は、あなたのコードではなく、ブーストバインドまたはスレッドプールであると思いますか?ライブロックが発生するような同期の問題があるようです。 –
これは可能かもしれませんが、 'boost :: threadpool'の代わりに' asio :: io_service'を使うようにコードを書き直しましたが、同じエラーが続く。しかし、私はそれがロックするかもしれない手掛かりがありません。より低い 'render'関数で見ることができるように、すべての関数はいくつかの独立した光線をトレースし、画像内に値を設定します(基本的には大きな配列です)。各スレッドは配列内の異なる要素にしかアクセスせず、書き込みのみを行うので、ライブロックを引き起こす可能性はありません。だから、おそらく 'boost :: bind'を間違って使用していると思います。 – robrene
また、別のこと:スレッドプール内に1つのスレッドしかない場合、スレッドプールはまだハングします。したがって、これは並行性の問題のようには見えません。 – robrene