Атомарность
От: vladserge Россия  
Дата: 14.10.04 06:47
Оценка: 2 (1)
Привет всем!

Неоднократно, в своей работе сталкиваюсь с необходимостю языковой конструкции которая позволяла бы указать что вот данный участок кода нужно выполнять целостно,атомарно категорически недопуская переключения потока (thread switching) в нем (внутри него).

например так

int usingResource=false;

static bool UseResource()
   {
       atom
       {
          if( usingResource ) return;
          usingResource=true;
       }

        ....
        ....
        .....
        usingResource=false;    
     }

во многих местах это позволило бы отказаться от иных, весьма накладных, средств синхронизации.

В .NET кое что на эту тему появилось, я про Interlocked, но вырозительности и прозрачности использования нет
зацените сами
        //0 for false, 1 for true.
        private static int usingResource = 0;

        //A simple method that denies reentrancy.
        static bool UseResource()
        {
            //0 indicates that the method is not in use.
            if(0 == Interlocked.Exchange(ref usingResource, 1))
            {
                Console.WriteLine("{0} acquired the lock", Thread.CurrentThread.Name);
            
                //Code to access a resource that is not thread safe would go here.
            
                //Simulate some work
                Thread.Sleep(500);

                Console.WriteLine("{0} exiting lock", Thread.CurrentThread.Name);
            
                //Release the lock
                Interlocked.Exchange(ref usingResource, 0);
                return true;
            }
            else
            {
                Console.WriteLine("   {0} was denied the lock", Thread.CurrentThread.Name);
                return false;
            }
        }

понятно, что найдуться чайники которые начнут внутрь атомарного кода пихать длительные операции приводя к завесалову всей системы. Но с этим можно бороться, например подразумевая что НЕпереключения потоков внутри атомарного кода происходит только в контексте приложения, а не всей системы. Таким образом если некто напишет ахинею типа

int usingResource=false;

static bool UseResource()
   {
       atom
       {
          if( usingResource ) return;
          usingResource=true;
        }

        for(; ;);
        ....
        .....
        usingResource=false;    
     }

то зависнет только это приложение.

Просто делюсь соображениями, возможно что я не одинок.... или это велосипед и я чего то незнаю. Обсудим ?
С Уважением Сергей Чикирев
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.