x += y раскрывается в x = x+y
Это правильно "по существу" но код в обоих случаях разный (это не макрос который раскрывается)
Происходит следующее
1) theSum.red и color.red принимаются на регистры (может только theSum.red)
2) выполняется сложение, результат в регистре
3) содержимое регистра записывается в theSum.red
Если не принимать мер, это не работает правильно с 2-мя и более нитками, т.к. др. нитка может "вклиниться" между 1 и 3.
Я выбрал такой способ решения (за счет усложнения кода)
struct ARGB {
float alpha, red, green, blue;
};
ARGB theSum[MAX_NUM_THREAD]; // глобальная переменная
....
void ThreadFunc( void * data ) // рабочая ф-ция нитки
{
...
ARGB color;
EvalColor(&color);
...
theSum[data->threadIndex].red += color.red;
...
}