Recycling the parent as the continuation

This style is useful when the continuation needs to inherit much of the parent’s state and the child does not need the state. The continuation must have the same type as the parent. Example 9-5 illustrates the model.

Example 9-5. Recycling parent as continuation

task* T::execute() {
    if( not recursing any further ) {
        ...
        return NULL;
    } else {
        set_ref_count(k);
        recycle_as_continuation();task& tk = new( allocate_child() ) T(...); tk.spawn();
        task& tk-1 = new( allocate_child() ) T(...); tk-1.spawn();
        ...
        task& t1 = new( c.allocate_child() ) T(...); t1.spawn();
        return &t1;
    }
}

Here are the key points of the pattern:

  • The call to set_ref_count uses k as its argument. There is no extra 1, as there is in blocking style.

  • Each child task is allocated by allocate_child.

  • The continuation is recycled from the parent, and hence gets the parent’s state without doing copy operations.

Get Intel Threading Building Blocks now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.