Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
10
Добавлен:
05.06.2015
Размер:
43.31 Кб
Скачать

Міністерство освіти і науки, молоді та спорту України

Кіровоградський національний технічний університет

МТФ

Кафедра Програмного забезпечення

Дисципліна СПЗ

Лабораторна робота №4

Виконав ст. гр. КІ-10-1

Перевірив викладач

Бісюк В.А.

Кіровоград 2013

Тема: Синхронизація потоків. Використання критичних секцій.

Завдання:

Використовуючи лабораторну роботу №2, скласти програму, в якій ініціалізувати критичну секцію і після створення 4 потоків, захопити критичну секцію для блокування інших потоків процеса присвоїти строковій змінній інше значення і вивести повідомлення “цей потік знаходиться в критичній секції”, а в інших потоках вивести те саме повідомлення, що було в 2-й лабораторній роботі.

Лістинг

using System; using System.Text; using System.Threading; using System.Threading.Tasks; namespace lab_2 {     class Program     {         static Object CriticalSection=new Object();          static bool s=false;                static string str;                 static void Main()                  {                        Thread p1 = new Thread(new ThreadStart(CritSect));             p1.Name = "Потiк №1";             p1.Start(); //Запуск 1-го потоку             Thread p2 = new Thread(new ThreadStart(second));             p2.Name = "Потiк №2";             p2.Start();                          Thread p3 = new Thread(new ThreadStart(third));             p3.Name = "Потiк №3";             p3.Start();              Thread p4 = new Thread(new ThreadStart(fourth));             p4.Name = "Потiк №4";             p4.Start();                           Thread.CurrentThread.Name="Null";             CritSect();             Console.ReadKey(true);             Console.ReadKey(true);         }         static void first()    //Функція, що запускається 1-м потоком         {             Console.WriteLine("Запущено потiк №1");             Console.ReadKey(true);             for (int i = 0; i < 49; i++)                 Console.WriteLine("Запущено потiк №1");             Thread.CurrentThread.Priority = ThreadPriority.Lowest;             Console.WriteLine("Встановлено прiоритет - Lowest");             Console.ReadKey(true);             for (int i = 0; i < 49; i++)                 Console.WriteLine("Запущено потiк №1");             Console.ReadKey(true);             if (Thread.CurrentThread.IsAlive)             {                 Console.WriteLine("Потiк №1 буде закрито!");                 Thread.CurrentThread.Abort();             }          }         static void second()             {             Console.WriteLine("Запущено потiк №2");             Console.ReadKey(true);             for (int i = 0; i < 49; i++)                 Console.WriteLine("Запущено потiк №2");             Thread.CurrentThread.Priority = ThreadPriority.BelowNormal;             Console.WriteLine("Встановлено прiоритет - BelowNormal");             Console.ReadKey(true);             for (int i = 0; i < 49; i++)                 Console.WriteLine("Запущено потiк №2");             Console.ReadKey(true);             if (Thread.CurrentThread.IsAlive)             {                 Console.WriteLine("Потiк №2 буде закрито!");                 Thread.CurrentThread.Abort();             }         }                  static void third()             {             Console.WriteLine("Запущено потiк №3");             Console.ReadKey(true);             for (int i = 0; i < 49; i++)                 Console.WriteLine("Запущено потiк №3");             Thread.CurrentThread.Priority = ThreadPriority.Normal;             Console.WriteLine("Встановлено прiоритет - Normal");             Console.ReadKey(true);             for (int i = 0; i < 49; i++)                 Console.WriteLine("Запущено потiк №3");             Console.ReadKey(true);             if (Thread.CurrentThread.IsAlive)             {                 Console.WriteLine("Потiк №3 буде закрито!");                 Thread.CurrentThread.Abort();             }         }         static void fourth()             {             Console.WriteLine("Запущено потiк №4");             Console.ReadKey(true);             for (int i = 0; i < 49; i++)                 Console.WriteLine("Запущено потiк №4");             Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;             Console.WriteLine("Встановлено прiоритет - AboveNormal");             Console.ReadKey(true);             for (int i = 0; i < 49; i++)                 Console.WriteLine("Запущено потiк №4");             Console.ReadKey(true);             if (Thread.CurrentThread.IsAlive)             {                 Console.WriteLine("Потiк №4 буде закрито!");                 Thread.CurrentThread.Abort();             }         }                  static void CritSect()         {             lock (CriticalSection)             {                 if (s==false)                 {                     str=Thread.CurrentThread.Name;                     Console.WriteLine(str+" знаходиться в критичнiй секцii");                     s=true;                 }                 else                 {                     Console.WriteLine("виконався потiк: "+Thread.CurrentThread.Name);                 }             }         }     } }

Соседние файлы в папке СПЗ