Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Igors от Октябрь 26, 2014, 12:50



Название: Еще случай контейнер + multi-thread
Отправлено: Igors от Октябрь 26, 2014, 12:50
Добрый день

Расчет параллелится хорошо, но есть проблемка: он заполняет др контейнер и сохраняет индексы на него. Псевдокод
Код
C++ (Qt)
void DoCalc( std::vector <Data> & src, std::vector<QPoint> & point )
{
#pragma omp parallel for
for (int i = 0; i < src.size(); ++) {
 ...
 src[i].mIndex = point.size();   // это не thread-safe ;-(
 point.push_back(p0);
 point.push_back(p1);
}
}
Делать каждому эл-ту src свой контейнер уродливо, да и накладно. Нет ли "более элегантного" решения?

Спасибо


Название: Re: Еще случай контейнер + multi-thread
Отправлено: Авварон от Октябрь 27, 2014, 21:19
Если кол-во результатов заранее известно, то можно ресайзнуть массив, а потом работать с ячейками напрямую (если они не пересекаются между потоками, то никаких блокировок не надо будет). Ну и считать индексы ручками.


Название: Re: Еще случай контейнер + multi-thread
Отправлено: m_ax от Октябрь 27, 2014, 23:06
Я, если честно, вообще не понял в чём тут проблема..
Если проблема в двух контейнерах, то у меня подобное было, решил через  промежуточный класс своего  итератора, который не требует доп. памяти, а просто итерирует значение "point" (что работает с различными представлениями grid-ов).. Но, поскольку, условия как всегда расплывчаты, думаю проблема совсем в другом..)  


Название: Re: Еще случай контейнер + multi-thread
Отправлено: Igors от Октябрь 28, 2014, 11:00
Если кол-во результатов заранее известно, то можно ресайзнуть массив, а потом работать с ячейками напрямую (если они не пересекаются между потоками, то никаких блокировок не надо будет). Ну и считать индексы ручками.
Каждый эл-т src создает разное кол-во эл-тов в point, зарезервироваться не удается.

Но, поскольку, условия как всегда расплывчаты, думаю проблема совсем в другом..)   
Какое для Вас "нерасплывчатое" - хз :) Возможно просто невнимательны, вопрос-то простой