Предполагая, что окна и что array
содержит элементы типа LONG
, вы можете сделать что-то вроде:
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++j)
for (int k = 0; k < o; ++k) {
LONG val = foo(...);
InterlockedAdd( &array[k], val);
}
Если вы не работаете в Windows, ваша платформа может иметь аналогичный набор API. Пока ваша платформа имеет тип API InterlockedCompareExchange()
, вы можете написать свою собственную версию InterlockedAdd()
.
Что-то вроде следующего (отказ от ответственности - не проверено):
int InterlockedAdd( int volatile* pDest, int operand)
{
int curval = *pDest;
int oldval;
do {
oldval = curval;
curval = InterlockedCompareExchange( pDest, oldval + operand, oldval);
} while (curval != oldval);
return oldval+operand;
}
Насколько я знаю, Boost имеет ограниченную поддержку только атомарных / блокированных операций, по-видимому, только для поддержки атомарного манипулирования подсчетом ссылок. Я не думаю, что поддержка взаимосвязанных операций в Boost - это больше, чем просто детали реализации (в настоящее время я имею дело с несколько более старой версией Boost, поэтому возможно, что это уже не так).
Существуют некоторые переносимые библиотеки, которые поддерживают атомарное сравнение, обмен и другие атомарные операции как документированные части интерфейса:
Также обратите внимание, что C ++ 0x будет иметь поддержку атомарных операций, таких как сравнение / обмен - я не уверен, каков уровень поддержки в современных компиляторах C ++ (это не похоже на VS 2010).