Читаю Рихтера, встретил в нём следующий пример:
internal struct SimpleSpinLock
{
private Int32 m_ResourceInUse; // 0=false (default), 1=true
public void Enter()
{
// Set the resource to in-use and if this thread
// changed it from Free, then return
while (Interlocked.Exchange(ref m_ResourceInUse, 1) != 0)
{
/* Black Magic goes here... */
}
}
public void Leave()
{
// Mark the resource as Free
Thread.VolatileWrite(ref m_ResourceInUse, 0);
}
}
Предлагается использовать следующим образом:
public sealed class SomeResource
{
private SimpleSpinLock m_sl = new SimpleSpinLock();
public void AccessResource()
{
m_sl.Enter();
// Only one thread at a time can get in here to access the resource...
m_sl.Leave();
}
}
Вопрос. Как это будет работать, если каждый раз при доступе к ресурсу создаётся новый объект SimpleSpinLock?
Ведь при создании нового объекта у него всегда будет m_ResourceInUse == 0, и никакой блокировки не произойдёт.
Наверное m_ResourceInUse должно быть статическим?