title: Interlocked and volatile
body: <p>I have a variable which I am using to represent state. It can be read and written to from multiple threads.</p>
  
  <p>I am using <code>Interlocked.Exchange</code> and <code>Interlocked.CompareExchange</code> to change it. However I am reading it from multiple threads.</p>
  
  <p>I know that <code>volatile</code> can be used to make sure the variable is not cached locally but always reads directly from memory.</p>
  
  <p>However if I set the variable to volatile then it generates a warning about using volatile and passing using ref to the Interlocked methods.</p>
  
  <p>I want to ensure that each thread is reading the most recent value of the variable and not some cached version, but I can't use volatile.</p>
  
  <p>There is a <code>Interlocked.Read</code>  but it is for 64 bit types and is not available on the compact framework. The documentation for it says that it is not needed for 32 bit types as they are already performed in a single operation.</p>
  
  <p>There are statements made across the internet that you don't need volatile if you are using the Interlocked methods for all your access. However you can't read a 32 bit variable using the Interlocked methods, so there is no way you can use Interlocked methods for all your access.</p>
  
  <p>Is there some way to accomplish the thread safe read and write of my variable without using lock?</p>