1

を使用して、プログラムの特定の側面を並列化しようとしています( 、linkboost::threadpoolの公式部分ではありません)。しかし、プログラムが停止しているのを見つけて調べたところ、 2つの非アクティブなスレッド(スレッドプールにあると思われる)と1つのスレッドが100%で実行されている(メインの実行スレッドにあると思われる)ことがわかりました。boosthtop

関連するコードは次のとおりです。

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

4

2 に答える 2

1

代わりに、boost :: thread_groupを即席のスレッドプールとして使用することを検討しましたか?ここで使用されているwait()の実装は何ですか?名前は、スレッドが無期限に非アクティブになる理由である可能性があるバリアを意味します。

編集:

無限ループに入らずにrenderを呼び出すことはできますか?おそらく、表示されていない光線をトレースまたはスポーンしている方法にあります。wait_for_all_tasksまた、実装に投稿したリンクを簡単に垣間見ることに基づいて、スレッドプールを呼び出したいと思うかもしれません。

于 2011-02-03T23:46:05.140 に答える
1

に与えられた引数boost::bind がコピーされます。

bindが取る引数は、返された関数オブジェクトによってコピーされ、内部的に保持されます。たとえば、次のコードでは次のようになります。

int i = 5;

bind(f、i、_1); iの値のコピーが関数オブジェクトに格納されます。boost::refおよびboost::crefを使用して、関数オブジェクトにコピーではなくオブジェクトへの参照を格納させることができます。

あなたの場合:

tp.schedule(boost::bind(&Renderer::render, scene, cam, image, x, y));

、、、およびのコピーをに送信camします。それはあなたが意図していることですか?imagexyRendered::render

于 2011-02-04T15:50:52.683 に答える