2010-04-30 3 views
3

내가 스레드 빌딩 블록 책을 읽고 있어요에 대한 질문. 이 코드 조각을 이해할 수 없습니다.TBB/C++ 코드

  FibTask& a=*new(allocate_child()) FibTask(n-1,&x); 
FibTask& b=*new(allocate_child()) FibTask(n-2,&y); 

이 지시어는 무엇을 의미합니까? 클래스 객체 참조와 새로운 작업을 함께? 설명 해줘서 고마워.

다음 코드는이 클래스 FibTask의 해상력이다. pointer 이미 할당 된 위치를 가정이 구문은 placement new라고

class FibTask: public task 

{ 
public: 

const long n; 
    long* const sum; 
FibTask(long n_,long* sum_):n(n_),sum(sum_) 
{} 
task* execute() 
{ 
    if(n<CutOff) 
    { 
    *sum=SFib(n); 
    } 
    else 
    { 
    long x,y; 

    FibTask& a=*new(allocate_child()) FibTask(n-1,&x); 
    FibTask& b=*new(allocate_child()) FibTask(n-2,&y); 
    set_ref_count(3); 
    spawn(b); 
    spawn_and_wait_for_all(a); 
    *sum=x+y; 
    } 
    return 0; 

} 
}; 
+0

그냥 nitpicking ... "빌딩 블록 스레딩" – Nav

답변

4
new(pointer) Type(arguments); 

, 다음 Type의 생성자는 단순히 해당 위치에서 호출하고, Type* 값을 반환한다.

그런 다음이 Type*Type&를 제공하는 참조를 취소했습니다. 사용자 정의 할당 알고리즘을 사용하고자 할 때 당신이 읽고있는 코드 (allocate_child())에서 입증 된 바와 같이

배치는 새가 사용된다.

+0

TBB 작업 기반 프로그래밍의 경우 구체적으로 다음과 같이 언급했습니다. '작업 공간을 할당하십시오. 이것은 특별한 "오버로드 된 새로운"에 의해 수행됩니다. TBB 튜토리얼 PDF 11.3 절에 나와 있습니다. – Nav

4

코드

FibTask& a=*new(allocate_child()) FibTask(n-1,&x); 
    FibTask& b=*new(allocate_child()) FibTask(n-2,&y); 

은이 태스크의 두 서브 태스크를 생성하고 생성 된 태스크의 후임이 작업 세트. 이러한 작업을 할당하는 데 사용되는 공간은 thsi-> allocate_child()가 배치로 사용될 때이 작업에 의해 관리됩니다. 이점은이 하위 작업이이 작업에 의해 소유되고 현재 작업이 자동으로 해제 될 때 해제된다는 것입니다. 현재 작업이 종속 작업에 종속되므로 수명을 단축 할 수 있기 때문에이 작업을 수행 할 수 있습니다.

FibTask* a=new(allocate_child()) FibTask(n-1,&x); 
    FibTask* b=new(allocate_child()) FibTask(n-2,&y); 
    set_ref_count(3); 
    spawn(*b); 
    spawn_and_wait_for_all(*a); 

로 기록 될 수있는 포인터를 삭제해야한다고 생각하지 않습니다이 코드를 유지하는 대신 포인터의 힘 사람들의 참조의 사용은, 그럼이 내가 가지고있는 설명입니다 녹이다.

+0

포인터를 사용하여 생각하고 명백한 (그리고 풍성한) 의견을 남기는 것이 더 나은 방법이었을 것입니다. 소멸자 (삭제와 반대)를 호출 할 필요가 없다는 것은 분명하지 않습니다. –

+0

@ 네일 네, 맞습니다. 코드가 비정상적이며 읽기가 약간 어렵습니다. –