public void Lock() { int myCluster = ThreadID.GetCluster(); Backoff localBackoff = new Backoff(LOCAL_MIN_DELAY, LOCAL_MAX_DELAY); Backoff remoteBackoff = new Backoff(REMOTE_MIN_DELAY, REMOTE_MAX_DELAY); while (true) { if (Interlocked.CompareExchange(ref state, myCluster, FREE) == FREE) { return; } int lockState = state; if (lockState == myCluster) { localBackoff.DoBackoff(); } else { remoteBackoff.DoBackoff(); } } }
public void Lock() { Backoff backoff = new Backoff(MIN_DELAY, MAX_DELAY); while (true) { while (state == 1) { } ; if (Interlocked.CompareExchange(ref state, 1, 0) == 0) { return; } backoff.DoBackoff(); } }
public void Lock() { Backoff backoff = new Backoff(MIN_DELAY, MAX_DELAY); //инициализируем бэкофф while (true) //бесконечный цикл { while (state == 1) { } ; //ждем пока занято //если состояние предыдущее свободно, то пытаемся установить 1 вместо 0 if (Interlocked.CompareExchange(ref state, 1, 0) == 0) { return; //взяли лок } else { //не удалось получить блокировку, которая у него была backoff.DoBackoff(); //иначе даем шанс другим потокам и ждем //Thread.Sleep(0); - мьютекс - сигнал планировщику, что нам делать нечего //одноместный семафор } } }