
готов лаби 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);
}
}
}