2016-08-15 5 views
0

Когда родительский объект будет уничтожен, будут ли автоматически уничтожены дочерние элементы или я должен уничтожить их явно?TBB мне нужно уничтожить детскую задачу или заботиться о родителях?

tbb::task *parent = new(tbb::task::allocate_root()) tbb::empty_task; 
parent->increment_ref_count(); 

for (...){ 
    new(parent->allocate_child()) aSampleTask(this); 
    parent->increment_ref_count(); 
    parent->spawn(*save); 
} 
parent->wait_for_all(); 
tbb::task::destroy(*parent); 

ответ

0

AFAIK, вам не нужно уничтожать дочерние задачи явно, так как у них больше нет детей. Я также проверил исходный код и следующие комментарии.

//! Уничтожьте задачу.

/** Обычно вызов этого метода не требуется, поскольку задача неявно удаляется после запуска метода execute(). Однако иногда задача должна быть явно освобождена, например, когда корневая задача используется в качестве родителя в spawn_and_wait_for_all. */

статическая пустота __TBB_EXPORTED_FUNC destroy (задача & жертва);

1

Обычно задача автоматически уничтожается планировщиком после его метод выполнения возвращается. Но иногда объекты задачи используются идиоматически (например, для подсчета ссылок) без выполнения выполнения. Такие задачи должны быть устранены с помощью метода destroy. Explicit task Destruction

Также вы должны использовать static void spawn(task& t)task Class (см Примечания)

BTV, действительно ли вы должны использовать задачи? TBB предоставляет различные параллельные функции. algorithms

+1

'spawn()' отлично, статические функции можно ссылаться именно так, с помощью указателей на экземпляр класса. В частности, это был нестатический метод, и старые коды все еще работают с новым методом статического метода. – Anton