Russian Qt Forum
Май 14, 2024, 04:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Еще случай контейнер + multi-thread  (Прочитано 2846 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Октябрь 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 свой контейнер уродливо, да и накладно. Нет ли "более элегантного" решения?

Спасибо
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #1 : Октябрь 27, 2014, 21:19 »

Если кол-во результатов заранее известно, то можно ресайзнуть массив, а потом работать с ячейками напрямую (если они не пересекаются между потоками, то никаких блокировок не надо будет). Ну и считать индексы ручками.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #2 : Октябрь 27, 2014, 23:06 »

Я, если честно, вообще не понял в чём тут проблема..
Если проблема в двух контейнерах, то у меня подобное было, решил через  промежуточный класс своего  итератора, который не требует доп. памяти, а просто итерирует значение "point" (что работает с различными представлениями grid-ов).. Но, поскольку, условия как всегда расплывчаты, думаю проблема совсем в другом..)  
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 28, 2014, 11:00 »

Если кол-во результатов заранее известно, то можно ресайзнуть массив, а потом работать с ячейками напрямую (если они не пересекаются между потоками, то никаких блокировок не надо будет). Ну и считать индексы ручками.
Каждый эл-т src создает разное кол-во эл-тов в point, зарезервироваться не удается.

Но, поскольку, условия как всегда расплывчаты, думаю проблема совсем в другом..)   
Какое для Вас "нерасплывчатое" - хз Улыбающийся Возможно просто невнимательны, вопрос-то простой
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.114 секунд. Запросов: 23.