DevioLab CRYPTO TRADING AUTOMATION
LIVE
AUTOMATED CRYPTO TRADING • BINANCE
Автоматизуйте свій криптопортфель
Торгові боти DevioLab аналізують крипторинок, автоматично відкривають і закривають позиції та керують вашим портфелем на Binance 24/7.
CRYPTO 80 Bots
BINANCE Spot Trading
TRADING 24 / 7
Спробувати DevioLab
deviolab.com

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

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

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

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

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

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

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА» ІКТА кафедра БІТ З В І Т до лабораторної роботи №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:46

Коментарі

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

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

Нічого не вибрано
0%

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

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

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

Admin

26.02.2023 12:38

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