예제 #1
0
        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();
                }
            }
        }
예제 #2
0
        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();
            }
        }
예제 #3
0
        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); - мьютекс - сигнал планировщику, что нам делать нечего //одноместный семафор
                }
            }
        }