Ещё интересуют пару моментов.
При использовании распараллеливания операция new или QVector::resize(n) может привести к нахлёсту памяти?
Ещё интересует понятие reentrant - мне его никак не осознать. Означает ли оно, что я могу спокойно запараллелить QVector::append в 4 потока?
Любые не-константные операции с любым контейнером НЕ "потокобезопасны" (NOT thread-safe) и ведут к крашу. Reentrant к этому отношения не имеет, это просто утверждение что ф-ция/метод отработает корректно если будет вызвана из самой себя, непосредственно или через цепочку др вызовов.
Если в параллельных вычислениях формируются результаты требующие сохранения в контейнере, то стандартная техника - каждая нитка пишет в свой контейнер, потом все сливается. Есть и менее хлопотный (но и менее эффективный) способ
C++ (Qt)
#pragma omp parallel for
for (int i = 0; i < 100000000; ++i)
{
#pragma omp critical
vec.append(i);
}
Правда в данном случае это будет работать медленнее чем без OpenMP
Однако если основные вычисления будут вне critical - то вполне.
Ещё интересуют пару моментов.
Так, "пара моментов" (типа "детали")
Да там еще ничего и не начиналось. Настоящее распараллеливание очень далеко от резвого создания потоков в Qt. Мало не покажется.