Suppose I have a variable “counter”, and there are several threads accessing and setting the value of “counter” by using Interlocked, i.e.:
int value = Interlocked.Increment(ref counter);
and
int value = Interlocked.Decrement(ref counter);
Can I assume that, the change made by Interlocked will be visible in all threads?
If not, what should I do to make all threads synchronize the variable?
EDIT: someone suggested me to use volatile. But when I set the “counter” as volatile, there is compiler warning “reference to volatile field will not be treated as volatile”.
When I read online help, it said, “A volatile field should not normally be passed using a ref or out parameter”.
InterlockedIncrement/Decrement on x86 CPUs (x86’s lock add/dec) are automatically creating memory barrier which gives visibility to all threads (i.e., all threads can see its update as in-order, like sequential memory consistency). Memory barrier makes all pending memory loads/stores to be completed.
volatileis not related to this question although C# and Java (and some C/C++ compilers) enforcevolatileto make memory barrier. But, interlocked operation already has memory barrier by CPU.Please also take a look my another answer in stackoverflow.
Note that I have assume that C#’s InterlockedIncrement/Decrement are intrinsic mapping to x86’s lock add/dec.