2016-06-24 3 views
1

우리는 이것이 TBB 스레드 풀을 초기화하려면 다음 TBB 코드를 사용하여 수행됩니다 몇 가지 처리를 수행 할 작업을 산란 TBB를 이용하여 코드 조각이 누출 (코어의 수와 일치합니다) :TBB 스폰 작업 메모리는

tbb::task_scheduler_init(8); 

그런 다음 우리는 우리가 (MainTask가 TBB :: 작업 클래스에서 파생 된) 다음 코드를 사용하여 산란 할 각 작업 : 우리는 우리의 코드를 실행하면

task = new (tbb::task::allocate_root()) MainTask(theAction, theOutputData); 
tbb::task::enqueue(*task); 

우리는 일정 금액을 사용하여 시작 메모리에 저장되고, 프로그램이 실행되고 새로운 작업을 생성 할 때, 전술 한 바와 같이, 메모리 사용량은 점차 증가합니다. 40 분의 실행 시간에 12KB에서 213KB로 증가합니다. 이것은 우리의 처리 코드로 인해 도전적이지 않으며, 예상대로 실행을 완료 한 TBB allocate_root 태스크에서 메모리를 해제하지 않은 TBB의 결과 인 것으로 보입니다.

왜 이런 일이 발생합니까? 이 문제를 해결하기 위해 수행해야 할 다른 작업이 있습니까? 아니면이 문제를 해결할 allocate_root 방식을 사용하지 않고 TBB 작업을 생성 할 수있는 대체 방법이 있습니까?

답변

2

걱정하지 마십시오. TBB는 성능을 향상시키기 위해 작업 메모리를 캐시하고 재사용합니다. 그리고 한 스레드가 작업을 계속 할당하고 다른 스레드가 스레드를 소비하는 생산자 - 소비자 사례에서 메모리 누수를 방지하기위한 특별한 메커니즘을 가지고 있습니다.

여전히 메모리 누수가 의심된다면, 메모리 소비가 처음 상승한 후에 멈추지 않는다는 것을 증명하는보다 정교한 테스트가 필요합니다 (물론 비선형 함수입니다). TBB에는 메모리 누수를 감지하기위한 특수 단위 테스트가 있습니다. src/test/test_task_leaks.cpp