Предполагая, что окна и что 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, поэтому вполне возможно, что это уже не так).
Есть некоторые портативные библиотеки, которые поддерживают атомное сравнения и обмена и другие атомарные операции, как документированных части интерфейса:
Также обратите внимание, что C++ 0x будет поддерживать атомные операции, такие как compa re/exchange - я не уверен, какой уровень поддержки находится в текущих компиляторах C++ (он не выглядит как VS 2010).
какая ОС? или вы используете ускорительную библиотеку? – Naveen
все это в Linux. – Hristo
Я немного смущен. В заголовке вы запрашиваете решение без блокировок и в вопросе, который вы хотите заблокировать? – Burkhard