МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра БІТ
/
Звіт до лабораторної роботи №5
З КУРСУ «ОПЕРАЦІЙНІ СИСТЕМИ»
Варіант 14
Мета роботи:
Ознайомлення з методами вирішення проблеми синхронізації потоків в C#, отримання практичних навичок виправлення помилок синхронізації в багатопотокових застосуваннях, створених на платформі .NET .
Завдання
Для вивчення основних можливостей службового застосування "Редактор Реєстру" виконати наступне.
Побудувати алгоритм програми, яка вирішує завдання оптимізації виконання певних операцій над матрицями з використанням багатопотоковості. Завдання наведені в таблиці відповідно до варіанту.
Використовуючи засоби VisualStudio(C#, C++, …) створіть програму, що вирішує дане завдання (в консольному чи WinForms режимі).
№ вар.
Кількість потоків
Завдання
10
3
Сума 2-х матриць (3x3).
Код програми
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace lab4
{
class ThreadClass
{
SemaphoreSlim sem = new SemaphoreSlim(7);
int[,] c = new int[4, 4];
int[,] a = { { 1, 1, 1, 1}, { 2, 2, 2, 2}, { 3, 3, 3, 3}, { 4, 4, 4, 4}};
int[,] b = { { 1, 1, 1, 1}, { 2, 2, 2, 2}, { 3, 3, 3, 3}, { 4, 4, 4, 4}};
public double SUM;
public void SetMas()
{
WriteMas(a);
WriteMas(b);
}
public void WriteMas(int[,] aa)
{
Console.WriteLine();
for (int i = 0; i <= 3; i++)
{
for (int j = 0; j <= 3; j++)
{
Console.Write("{0} ", aa[i, j]);
}
Console.WriteLine();
}
}
public void writestring1()
{
sem.Wait();
for (int i = 0; i <= 0; i++)
{
for (int j = 0; j <= 3; j++)
{
c[i, j] = a[i, 0] * b[0, j] + a[i, 1] * b[1, j] + a[i, 2] * b[2, j] + a[i, 3] * b[3, j];
}
}
sem.Release();
}
public void writestring2()
{
sem.Wait();
for (int i = 1; i <= 1; i++)
{
for (int j = 0; j <= 1; j++)
{
c[i, j] = a[i, 0] * b[0, j] + a[i, 1] * b[1, j] + a[i, 2] * b[2, j] + a[i, 3] * b[3, j];
}
}
sem.Release();
}
public void writestring3()
{
sem.Wait();
for (int i = 1; i <= 1; i++)
{
for (int j = 2; j <= 3; j++)
{
c[i, j] = a[i, 0] * b[0, j] + a[i, 1] * b[1, j] + a[i, 2] * b[2, j] + a[i, 3] * b[3, j];
}
}
sem.Release();
}
public void writestring4()
{
sem.Wait();
for (int i = 2; i <= 2; i++)
{
for (int j = 0; j <= 1; j++)
{
c[i, j] = a[i, 0] * b[0, j] + a[i, 1] * b[1, j] + a[i, 2] * b[2, j] + a[i, 3] * b[3, j];
}
}
sem.Release();
}
public void writesthring5()
{
sem.Wait();
for (int i = 2; i <= 2; i++)
{
for (int j = 2; j <= 3; j++)
{
c[i, j] = a[i, 0] * b[0, j] + a[i, 1] * b[1, j] + a[i, 2] * b[2, j] + a[i, 3] * b[3, j];
}
}
sem.Release();
}
public void writestring6()
{
sem.Wait();
for (int i = 3; i <= 3; i++)
{
for (int j = 0; j <= 1; j++)
{
c[i, j] = a[i, 0] * b[0, j] + a[i, 1] * b[1, j] + a[i, 2] * b[2, j] + a[i, 3] * b[3, j];
}
}
sem.Release();
}
public void writestring7()
{
sem.Wait();
for (int i = 3; i <= 3; i++)
{
for (int j = 2; j <= 3; j++)
{
c[i, j] = a[i, 0] * b[0, j] + a[i, 1] * b[1, j] + a[i, 2] * b[2, j] + a[i, 3] * b[3, j];
}
}
sem.Release();
}
public void WriteREZ()
{
WriteMas(c);
}
public void Sum()
{
Thread.Sleep(100);
sem.Wait();
sem.Wait();
sem.Wait();
sem.Wait();
sem.Wait();
sem.Wait();
sem.Wait();
WriteREZ();
SUM = 0;
for (int i = 0; i < c.GetLength(0); i++)
{
for (int j = 0; j < c.GetLength(1); j++)
{
SUM += c[i,j];
}
}
Console.WriteLine("Сума всiх елементiв масиву = " + SUM);
sem.Release();
sem.Release();
sem.Release();
sem.Release();
sem.Release();
sem.Release();
sem.Release();
Console.ReadKey(true);
}
}
class Program
{
static void Main(string[] args)
{
ThreadClass tc = new ThreadClass();
tc.SetMas();
/* tc.writestring1();
tc.writestring2();
tc.writestring3();
tc.writestring4();*/
Thread firstthread = new Thread(new ThreadStart(tc.writestring1));
Thread secondthread = new Thread(new ThreadStart(tc.writestring2));
Thread thirdthread = new Thread(new ThreadStart(tc.writestring3));
Thread fourthread = new Thread(new ThreadStart(tc.writestring4));
Thread fifththread = new Thread(new ThreadStart(tc.writesthring5));
Thread sixththread = new Thread(new ThreadStart(tc.writestring6));
Thread sevenththread = new Thread(new ThreadStart(tc.writestring7));
Thread eigththread = new Thread(new ThreadStart(tc.Sum));
firstthread.Start();
secondthread.Start();
thirdthread.Start();
fourthread.Start();
fifththread.Start();
sixththread.Start();
sevenththread.Start();
eigththread.Start();
Console.ReadLine();
}
}
}
Результати виконання
/
Висновок
Під час лабораторної роботи №5 я ознайомився з методами вирішення проблеми синхронізації потоків в C#, отримав практичні навички виправлення помилок синхронізації в багатопотокових програмах, створених на платформі .NET .