// Заблокировать вызовы метода Sumlt. lock(sa) answer = sa.Sumlt(a);
Console.WriteLine("Сумма для потока " + Thrd.Name +
" равна " + answer);
Console.WriteLine(Thrd.Name + " завершен.");
}
}
class Sync {
static void Main {
int[] a = {1, 2, 3, 4, 5};
MyThread mtl = new MyThread("Потомок #1", a);
MyThread mt2 = new MyThread("Потомок #2", a);
mtl.Thrd.Join; mt2.Thrd.Join;
В данной программе блокируется вызов метода
sa.Sum It , а не сам методSum It . Ниже приведена соответствующая строка кода, в которой осуществляется подобная блокировка.// Заблокировать вызовы метода Sumlt . lock(sa) answer = sa.Sumlt(a);
Объект sa является закрытым, и поэтому он может быть благополучно заблокирован. При таком подходе к синхронизации потоков данная программа дает такой же правильный результат, как и при первоначальном подходе.
Класс Monitor и блокировка
Ключевое слово lock на самом деле служит в C# быстрым способом доступа к средствам синхронизации, определенным в классе
Monitor,который находится в пространстве именSystem. Threading.В этом классе определен, в частности, ряд методов для управления синхронизацией. Например, для получения блокировки объекта вызывается методEnter , а для снятия блокировки — методExit (). Ниже приведены общие формы этих методов:public static void Enter(object
где
Впрочем, один метод из класса
Monitorможет все же оказаться полезным. Это методTryEnter , одна из общих форм которого приведена ниже.public static bool TryEnter(object
Этот метод возвращает логическое значение
true,если вызывающий поток получает блокировку для объектаКроме того, в классе
Monitorопределены методыWait , Pulse () иPulseAll ,которые рассматриваются в следующем разделе.Сообщение между потоками с помощью методов Wait , Pulse и PulseAll