Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Введення в курс паралельних обчислень. Створення перших багатопоточних додатків.Стр 1 из 11Следующая ⇒
Лабораторна робота №1.
Потоки дозволяють програмі C # виконувати паралельну обробку, за рахунок чого з'являється можливість одночасного виконання декількох операцій. Наприклад, потоки можна використовувати для спостереження введення даних користувачем, виконання фонових завдань і обробки одночасних потоків введення. Простір імен System.Threading містить класи та інтерфейси, що підтримують багатопотокове програмування, і дозволяє без особливих зусиль виконувати такі завдання як створення і запуск нових потоків, синхронізація декількох потоків, припинення потоків і їх відміна. Щоб додати потік у код C #, створіть функцію, яка буде виконуватися поза головним потоком і вкажіть в ній новий об'єкт Thread. У наступному прикладі коду створюється новий потік в додатку C #
System.Threading.Thread newThread; newThread = new System.Threading.Thread(anObject.AMethod);
У наступному прикладі коду запускається створений потік в додатку C #.
newThread.Start();
Методи керування потоками. У наступній таблиці наводяться методи, за допомогою яких можна керувати окремими потоками.
Створимо простий консольний додаток (рис.1).
Рисунок 1. – Вікно створення консольного додатку
Виведемо у однопотоковому режимі повідомлення " Hello World! " за допомогою коду:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleMultithreadingApplication { class Program { static void Main(string[] args) { for (int i = 0; i < 10; i++) { Console.WriteLine(" Hello World! "); } Console.ReadLine(); } } }
Так як дія виконується у один потік (метод Main), результат буде наступним:
Рисунок 2. – Результати роботи програми
Для використання багато потоковості, використовується директива System.Threading:
using System.Threading;
Створимо 3 різних методи, які будуть виконуватись у різних потоках:
static void FirstThread() { for (int i=0; i< 10; i++) { Console.WriteLine(" Первый поток говорит: Hello! "); } } static void SecondThread() { for (int i = 0; i < 10; i++) { Console.WriteLine(" Второй поток говорит: World! "); } } static void ThirdThread() { for (int i = 0; i < 10; i++) { Console.WriteLine(" Третий поток говорит: Hello World! "); } }
У методі Main створимо потоки:
Thread thread1 = new Thread(new ThreadStart(FirstThread)) Thread thread2 = new Thread(new ThreadStart(SecondThread)) Thread thread3 = new Thread(new ThreadStart(ThirdThread))
У нашому випадку потік:
thread1 - викликає метод FirstThread thread2 - викликає метод SecondThread thread3 - викликає метод ThirdThread
Запускаємо потоки, за допомогою методу Start():
thread1.Start() thread2.Start() thread3.Start()
Додамо на вивід у головному потоку наступні стрічки коду:
Console.WriteLine(" Главный поток молчит") Console.WriteLine(" Завершение главного потока") Console.ReadLine()
Запустимо додаток. Результат буде наступним:
Рисунок 3. – Результат виконання програми
Як бачимо з результату, потоки виконуються з різним інтервалом у часі. Для того, що б задати час блокування, на виконання потоку, використовуємо метод Sleep (). Для головного потоку встановимо час блокування 1000мс:
Thread.Sleep(1000) Console.WriteLine(" Главный поток молчит") Console.WriteLine(" Завершение главного потока") Console.ReadLine()
Аналогічно, встановимо час блокування, для дочірніх потоків 20мс, 100мс, 90мс:
static void FirstThread() { for (int i=0; i< 10; i++) { Thread.Sleep(20); Console.WriteLine(" Первый поток говорит: Hello! "); } Console.WriteLine(" Завершение первого потока"); } static void SecondThread() { for (int i = 0; i < 10; i++) { Thread.Sleep(100); Console.WriteLine(" Второй поток говорит: World! "); } Console.WriteLine(" Завершение второго потока"); } static void ThirdThread() { for (int i = 0; i < 10; i++) { Thread.Sleep(90); Console.WriteLine(" Третий поток говорит: Hello World! "); } Console.WriteLine(" Завершение третьего потока"); }
Запустимо програму на виконання. Результат виконання буде наступним: Рисунок 4. – Результати роботи програми
Як видно з результату виконання програми: перший потік завершиться першим, так як час блокування складає 20 мс. Другий і третій потік будуть виконуватися майже одночасно, так як час блокування складає 90 мс і 100 мс. Другий потік і головний потік завершаться майже одночасно так як загальний час блокування другого і головного потоку складає 1000 мс.
|