假设 windows 并且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。只要您的平台有一种InterlockedCompareExchange()
API,您就可以编写自己的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)。