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
usesk
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.