boost::threadpool
(boost
, link의 공식 파트가 아님)을 사용하여 프로그램의 특정 부분을 병렬 처리하려고합니다. 그러나, 내 프로그램 실속 및 검사시, 두 개의 비활성 스레드 (내 스레드 풀에서 용의자가) 및 하나의 스레드를 100 % (내 주 실행 스레드 용의자)에서 실행되는 나를 보여줍니다 htop
보여줍니다. 여기 boost :: bind를 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
또한, 또 하나 : 스레드 풀에 하나의 스레드 만있을 때도 여전히 중단됩니다.그래서 이것은 동시성 문제처럼 보이지 않습니다. – robrene