From what I understand, the 'volatile' modifie开发者_StackOverflowr in C# has two effects:
- Inserts fences as necessary for the target processor
- Prevents certain compiler optimizations
On x86 / amd64, (1) is irrelevant. Those processors don't require fences for volatile semantics. (ia64 is different, though.)
So, we are down to (2). But, for examples that I tried, volatile does not make any difference to the jit-ted assembly.
My question is: Can you give an example of a C# code sample where adding a 'volatile' modifier on a field results in different jit-ted assembly code?
Maybe this is what you are looking for.
Marc Gravell has an repeatable example of how the lack of a volatile keyword can cause problems.
It's also discussed here.
It's worth noting (as Marc does) that the compiler optimisations are only seen when compiled in Release mode.
精彩评论