готов лаби 4 курс 1 сим / СПЗ / laba_5
.docxМіністерство освіти і науки, молоді та спорту України
Кіровоградський національний технічний університет
МТФ
Кафедра Програмного забезпечення
Дисципліна СПЗ
Лабораторна робота №5
Виконав ст. гр. КІ-09-2
Жабчик Є.Л.
Перевірив викладач
Бісюк В.А.
Кіровоград 2012
Тема: Синхронизація потоків
Завдання: Скласти програму і запустити процес в якому ініціалізується і заповнюється дійсними числами двомірний масив 3*10 елементів створюються 4-ри потоки в яких виконується:
-
в 1-му складаються всі елементи 1-го рядка
-
в 2-му від суми парних елементів віднімається сума непарних 2-го рядка
-
в 3-му сума додатніх елементів ділиться на суму від’ємних 3-го рядка
-
всі результати обчислень передаються в 4-й потік, який в цей час чекає на результати роботи 1...3 потоків за допомогою конструкції:
while (!proceed)
Thread.Sleep(x);
Отримавши результати 4-й потік одразу виводить їх на екран і сумує потім виводить суму всіх 4-х результатів і процес завершується.
Лістинг
using System; using System.Threading; namespace project_5 { class Program { static int[,] mas=new int[3,10]; static Random generate=new Random(); static bool thread1,thread2,thread3,proceed; static int i,j; static int summa=0; static int riznitsa=0; static int chastka=0; static int result=0; static int SumPar=0; static int SumNepar=0; static int SumDod=0; static int SumVid=0; public static void Main() { int i,j; for (i=0; i<3; i++) for (j=0; j<10; j++) { Console.SetCursorPosition(6*j,3*i); mas[i,j]=generate.Next(-80,100); Console.Write(mas[i,j]); } Console.WriteLine("\n\n\n"); Thread p1=new Thread(new ThreadStart(sum)); p1.Start(); Thread p2=new Thread(new ThreadStart(rizn)); p2.Start(); Thread p3=new Thread(new ThreadStart(dil)); p3.Start(); Thread p4=new Thread(new ThreadStart(rez)); p4.Start(); Console.ReadKey(); }
static void sum() { for (i=0; i<10; i++) summa=summa+mas[0,i]; thread1=true; if (thread1==true && thread2==true && thread3==true) proceed=true; } static void rizn() { for (j=0; j<10; j++) { if (mas[1,j]%2==0) SumPar+=mas[1,j]; else SumNepar+=mas[1,j]; } riznitsa=SumPar-SumNepar; thread2=true; if (thread1==true && thread2==true && thread3==true) proceed=true; } static void dil() { for (j=0; j<10; j++) { if (mas[2,j]>=0) SumDod+=mas[2,j]; else SumVid+=mas[2,j]; } chastka=SumDod/SumVid; thread3=true; if (thread1==true && thread2==true && thread3==true) proceed=true; } static void rez() { while (!proceed) { Thread.Sleep(300); } Console.WriteLine("Сумма елементiв першого рядка = "+summa); Console.WriteLine("Рiзниця суми парних i непарних елементiв = "+riznitsa); Console.WriteLine("Дiлення суми додатнiх елементiв на суму вiд'ємних елементiв = "+chastka); result=summa+riznitsa+chastka; Console.WriteLine("Сумарний результат по всiм трьом функціям = "+result); } } }