ウィンドウを想定し、次のようなことができる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 ではないようです)。