МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
кафедра БІТ
З В І Т
до лабораторної роботи №5
з курсу: «ОПЕРАЦІЙНІ СИСТЕМИ»
на тему: «Проблема синхронізації потоків в C#»
Мета: ознайомлення з методами вирішення проблеми синхронізації потоків в C#, отримання практичних навичок виправлення помилок синхронізації в багатопотокових застосуваннях, створених на платформі .NET. Проблеми синхронізації і організації паралельних обчислень є одними з найскладніших у практичному програмуванні.
Короткі теоретичні відомості:
Необхідність організації паралельного виконання потоків, що взаємодіють, потребує наявності механізмів обміну даними між ними і забезпечення їхньої синхронізації. Під час взаємодії потоків (процесів) можуть виникнути конкурентні дії зі спільними даними. Так існують ситуації в яких 2 і більше потоки читають або записують дані одночасно і при цьому кінцевий результат залежить від того, який з них був першим. Така ситуація називається «станом змагань» або «гонок».
Блокування.
Раціональнішим розв'язанням є використання блокувань (locks). Блокування — це механізм, який не дозволяє більш як одному потокові виконувати код критичної секції. Використання блокування зводиться до двох дій: запровадження (заблокування, функція acqui ге_lоск()) і зняття блокування (розблокування, функція release_lock()). У разі заблокування перевіряють, чи не було воно вже зроблене іншим потоком, і якщо це так, цей потік переходить у стан очікування, інакше він запроваджує блокування і входить у критичну секцію. Після виходу із критичної секції потік знімає блокування.
Завдання: Побудувати алгоритм програми, яка вирішує завдання оптимізації виконання певних операцій над матрицями з використанням багато потоковості, синхронізувати потоки. Завдання наведені в таблиці відповідно до варіанту.
№ вар.
Кількість потоків
Завдання
1
3
Сума 2-х матриць (3х3).
Текст програми:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using ConsoleApplication1;
namespace ConsoleApplication1
{
class ThreadClass
{
Random qr = new Random();
int[,] a = new int[3, 3];
int[,] b = new int[3, 3];
int[,] c = new int[3, 3];
public void thread1()
{
int i = 0;
{
for (int j = 0; j <= 2; j++)
{
a[i, j] = qr.Next(0, 11);
}
}
int x = 0;
{
for (int y = 0; y <= 2; y++)
{
b[x, y] = qr.Next(11, 22);
}
}
}
public void thread2()
{
int i = 1;
{
for (int j = 0; j <= 2; j++)
{
a[i, j] = qr.Next(0, 11);
}
}
int x = 1;
{
for (int y = 0; y <= 2; y++)
{
b[x, y] = qr.Next(11, 22);
}
}
}
public void thread3()
{
int i = 2;
{
for (int j = 0; j <= 2; j++)
{
a[i, j] = qr.Next(0, 11);
}
}
int x = 2;
{
for (int y = 0; y <= 2; y++)
{
b[x, y] = qr.Next(11, 22);
}
}
}
public void ShowMasA()
{
for (int i = 0; i <= 2; i++)
{
for (int j = 0; j <= 2; j++)
{
Console.Write("{0} ", a[i, j]);
}
Console.WriteLine();
}
Console.WriteLine();
}
public void ShowMasB()
{
for (int x = 0; x <= 2; x++)
{
for (int y = 0; y <= 2; y++)
{
Console.Write("{0} ", b[x, y]);
}
Console.WriteLine();
}
Console.WriteLine();
}
public void ShowMasC()
{
for (int i = 0; i <= 2; i++)
{
for (int j = 0; j <= 2; j++)
{
Console.Write("{0} ", c[i, j]);
}
Console.WriteLine();
}
}
public void CriticalZone()
{
lock (this)
{
for (int i = 0, x = 0; (i <= 2) && (x <= 2); i++, x++)
{
for (int j = 0, y = 0; (j <= 2) && (y <= 2); j++, y++)
{
c[i, j] = a[i, 0] * b[0, y] + a[i, 1] * b[1, y] + a[i, 2] * b[2, y];
}
}
}
}
}
class Program
{
static void Main(string[] args)
{
ThreadClass asd = new ThreadClass();
Thread firstthread = new Thread(new ThreadStart(asd.thread1));
Thread secondthread = new Thread(new ThreadStart(asd.thread2));
Thread thirdthread = new Thread(new ThreadStart(asd.thread3));
Thread CriticalZone = new Thread(new ThreadStart(asd.CriticalZone));
firstthread.Start();
secondthread.Start();
thirdthread.Start();
CriticalZone.Start();
asd.ShowMasA();
asd.ShowMasB();
asd.ShowMasC();
Console.ReadKey();
}
}
}
Результати проведеної роботи:
/
/
Висновки: під час виконання даної лабораторної роботи я вивчив поняття багато потоковості в сучасних операційних системах, отримав практичні навички створення багато потокових застосувань в середовищі Visual Studio C#, створив програму що реалізує багато потоковість, а також синхронізує 2 (в моєму випадку) потоки, наочно побачив виконання одночасно двох потоків данних.