There are several variations on _InterlockedDecrement that vary based on the data types they involve and whether processor-specific acquire or release semantics is used.
While the _InterlockedDecrement function operates on 32-bit integer values, _InterlockedDecrement16 operates on 16-bit integer values and _InterlockedDecrement64 operates on 64-bit integer values.
The _InterlockedDecrement_acq, _InterlockedDecrement16_acq and _InterlockedDecrement64_acq intrinsic functions are the same as the corresponding functions without the _acq suffix except that the operation is performed with acquire semantics, which is useful when entering a critical section.
The _InterlockedDecrement_rel, _InterlockedDecrement16_rel and _InterlockedDecrement64_rel intrinsic function are the same as the corresponding functions without the _rel suffix except that the operation is performed with release semantics, which is useful when leaving a critical section.
The variable pointed to by the lpAddend parameter must be aligned on a 32-bit boundary; otherwise, this function fails on multiprocessor x86 systems and any non-x86 systems.
In Visual C++ 2005, these functions behave as read-write memory barriers. For more information, see _ReadWriteBarrier.
These routines are only available as intrinsics.