Проблема синхронізації потоків в C#

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
ІКТА
Факультет:
ЗІ
Кафедра:
Не вказано

Інформація про роботу

Рік:
2014
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Операційні системи

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА» ІКТА кафедра БІТ З В І Т до лабораторної роботи №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 (в моєму випадку) потоки, наочно побачив виконання одночасно двох потоків данних.
Антиботан аватар за замовчуванням

12.06.2015 19:06-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!