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

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

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

МТФ

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

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

Лабораторна робота №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);          }     } }

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