by Miha Markič
21. January 2010 20:41
I am thinking about using a generic version of Thread.VolatileRead and Thread.VolatileWrite. The code is similar to existing one (actually there are plenty of overloads) with the difference of generic type parameter:
[MethodImpl(MethodImplOptions.NoInlining)]
public T VolatileRead(ref T address)
{
T result = address;
Thread.MemoryBarrier();
return result;
}
[MethodImpl(MethodImplOptions.NoInlining)]
public void VolatileWrite(ref T address, T value)
{
Thread.MemoryBarrier();
address = value;
}
Why would I use generics if there is plenty of overloads already there? Because you have to perform casting to and from object since there is a single overload that accepts reference (ref object address that is). Here is an example:
Tubo tubo = new Tubo();
object param = tubo;
Tubo read = (Tubo)Thread.VolatileRead(ref param);
Isn’t the following code much better?
Tubo tubo = new Tubo();
Tubo read = MyThread.VolatileRead(ref tubo);
The questions is whether my code is correct or not. Sure it looks like correct but one never knows for sure when dealing with threading. Feedback appreciated.