готов лаби 4 курс 1 сим / СПЗ / laba_4
.docxМіністерство освіти і науки, молоді та спорту України
Кіровоградський національний технічний університет
МТФ
Кафедра Програмного забезпечення
Дисципліна СПЗ
Лабораторна робота №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); } } } } }