Добрый день
Задача типа "близок локоть да не укусишь"
Вот максимально упрощенное описание: есть "точки" значения в которых должны быть вычислены, а потом осреднены с соседними. Схема такая:
*------*-----*-----* (первый блок из 4 точек)
*------*-----* (второй блок из 3 точек)
*------*---*........* (третий блок из 100 точек)
и.т.п
Осреднение происходит для точек одного блока, однако одна и та же точка может входить в любое число блоков
struct Point {
float mBaseVal; // начальное значение - считается 1 раз и больше не меняется
float mCalcVal; // выходное значение (с учетом всех осреднений)
float mBaseW; // "собственный" вес точки (обычно 1.0f)
float mCalcW; // вес точки с учетом всех осреднений
void Calculate( float weight )
{
mBaseW = mCalcW = weight;
mBaseVal = mCalcVal = CalculatePoint(...):
}
void Blur( const Point & src )
{
mCalcVal = (mCalcVal * mCalcW + src.mBaseVal * src.mBaseW) / (mCalcW + src.mBaseW);
mCalcW += src.mBaseW;
}
};
И все прекрасно, и проблем никаких, но вот когда я вычисляю точки параллельно, в разных нитках - тогда "ой". Вычислив точку, я не могу ее сразу осреднить т.к. соседняя может быть еще не вычислена. Ждать ее бесполезно - дело умрет на блокировках. Конечно, есть "общее" решение - сделать 2 прохода, первый вычисляет (параллельно), второй осредняет. Но здесь это очень накладно, нужно приложить массу усилий чтобы повторить всю последовательность блоков точек. Есть ли свежие идеи? Как выкрутиться?
Спасибо