使用原子 CAS。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683560(v=vs.85).aspx
您可以使其无锁,但不能免费等待。
正如基里尔建议的那样,这类似于您的情况下的自旋锁。
我认为这可以满足您的需求,但我建议您在继续使用它之前考虑所有可能性,因为我根本没有测试过它:
inline bool
InterlockedSetIfEqual(volatile LONG* dest, LONG exchange, LONG comperand)
{
return comperand == ::InterlockedCompareExchange(dest, exchange, comperand);
}
inline bool InterlockedDecrementNotZero(volatile LONG* ptr)
{
LONG comperand;
LONG exchange;
do {
comperand = *ptr;
exchange = comperand-1;
if (comperand <= 0) {
return false;
}
} while (!InterlockedSetIfEqual(ptr,exchange,comperand));
return true;
}
关于为什么您的待处理工作项应该低于零的问题仍然存在。你真的应该确保增量的数量与减量的数量相匹配,一切都会好起来的。如果违反了这个约束,我可能会添加一个断言或异常。