Привет всем!
Неоднократно, в своей работе сталкиваюсь с необходимостю языковой конструкции которая позволяла бы указать что вот данный участок кода нужно выполнять целостно,атомарно категорически недопуская переключения потока (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;
}
то зависнет только это приложение.
Просто делюсь соображениями, возможно что я не одинок.... или это велосипед и я чего то незнаю. Обсудим ?