Синхронизация. Лекция12

Слайд 2

Синхронизация

static int x=0;
static void Main(string[] args)
{
for (int i

Синхронизация static int x=0; static void Main(string[] args) { for (int i
= 0; i < 5; i++)
{
Thread myThread = new Thread(Count);
myThread.Name = "Поток " + i.ToString();
myThread.Start();
}
Console.ReadLine();
}
public static void Count()
{
x = 1;
for (int i = 1; i < 9; i++)
{
Console.WriteLine("{0}: {1}", Thread.CurrentThread.Name, x);
x++;
Thread.Sleep(100);
}
}

Мы предполагаем, что метод выведет все значения x от 1 до 8 и так для каждого потока

Слайд 3

Синхронизация
Lock - это ключевое слово C #; он предотвращает выполнение потоком

Синхронизация Lock - это ключевое слово C #; он предотвращает выполнение потоком
того же блока кода, что и другой поток выполнения. Такой блок кода называется заблокированным кодом. Поэтому, если поток пытается ввести заблокированный код, он
будет ждать, пока объект не будет выпущен.
Для блокировки с ключевым словом lock используется объект-заглушка, в данном случае это переменная locker.
public static void Count()
{
lock (locker)
{
x = 1;
for (int i = 1; i < 9; i++)
{
Console.WriteLine("{0}: {1}", Thread.CurrentThread.Name, x);
x++;
Thread.Sleep(100);
}
}
}

Слайд 4

Dead lock

Dead Lock
В многопоточной среде может возникнуть мертвая блокировка; приложение зависает,

Dead lock Dead Lock В многопоточной среде может возникнуть мертвая блокировка; приложение
потому что два или более
Потока ждут друг друга для завершения. Обычно это происходит, когда общий ресурс заблокирован одним
поток и другой поток ожидает доступа к нему.
Вот как приложение зависло.
1. Tsk1 получает блокировку «thislockA».
2. Tsk2 получает блокировку «thislockB».
3. Tsk1 пытается получить блокировку «thislockB», но она уже удерживается Tsk2 и, таким образом,
Tsk1 блокируется, пока «thislockB» не будет выпущен.
4. Tsk2 пытается получить блокировку «thislockA», но она удерживается Tsk1 и, таким образом, Tsk2.
блокирует, пока "thislockA" не будет выпущен.
На этом этапе оба потока заблокированы и никогда не завершатся. Следовательно, приложение зависло.
Чтобы предотвратить зависание приложения, важно осторожно использовать оператор блокировки

Слайд 5

Пользовательский интерфейс и потоки

Поток пользовательского интерфейса (пользовательского интерфейса) управляет жизненным циклом элементов

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

Слайд 6

Пользовательский интерфейс и потоки

Поток пользовательского интерфейса (пользовательского интерфейса) управляет жизненным циклом элементов

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

Слайд 7

Common language Runtime

Common language Runtime

Слайд 10

MPI (С++, С)
OpenMP (многоядерное программирование), поддерживается на С++
Cuda (Nvidea графический ускоритель)
SIMD

MPI (С++, С) OpenMP (многоядерное программирование), поддерживается на С++ Cuda (Nvidea графический
(Single Instruction Multiply Data)
SISD (Single Instruction Single Data)
MIMD (Multiply Instruction Multiply Data)