Если вы предпочитаете вложение, вам следует установить omp_set_max_active_levels(...)
(по крайней мере, 2 в вашем случае) и omp_set_nested(true)
.
Однако я бы честно предложил вам использовать std::future
, в этом случае он очень прост в использовании и будет запускать вашу функцию в отдельном потоке (чтобы быть уверенным, вы должны передать ее std::launch::async
в качестве первогоаргумент).Как правило, он не такой капризный, как OpenMP, когда дело доходит до вложения.
Вызов будет выглядеть примерно так:
std::future<BigBlock> block1 = std::async(std::launch::async, ImportFunc, ...);
Где ...
- это любые параметры, которые вы хотите передать ImportFunc
.
Как только вам понадобятся данные, которые вы вызываете block1.get()
, он будет ожидать завершения потока, если он этого не сделал, или просто вернет данные, если у него есть.В этот момент я бы предложил, чтобы у вас был конструктор перемещения (вы действительно не хотите копировать его, если он большой, тогда, опять же, у вас, вероятно, уже есть один для ImportFunc
, или вы передаете указатели, но в этомВ этом случае убедитесь, что вы не delete
, когда будущее разрушается, если вы создаете другой экземпляр BigBlock
), и просто перемещаете его в другой экземпляр BigBlock
(т. е. тот, над которым ваши потоки хотят работать).