Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Введення в курс паралельних обчислень. Створення перших багатопоточних додатків.






Лабораторна робота №1.

 

Потоки дозволяють програмі C # виконувати паралельну обробку, за рахунок чого з'являється можливість одночасного виконання декількох операцій. Наприклад, потоки можна використовувати для спостереження введення даних користувачем, виконання фонових завдань і обробки одночасних потоків введення.

Простір імен System.Threading містить класи та інтерфейси, що підтримують багатопотокове програмування, і дозволяє без особливих зусиль виконувати такі завдання як створення і запуск нових потоків, синхронізація декількох потоків, припинення потоків і їх відміна.

Щоб додати потік у код C #, створіть функцію, яка буде виконуватися поза головним потоком і вкажіть в ній новий об'єкт Thread. У наступному прикладі коду створюється новий потік в додатку C #

 

System.Threading.Thread newThread;

newThread = new System.Threading.Thread(anObject.AMethod);

 

У наступному прикладі коду запускається створений потік в додатку C #.

 

newThread.Start();

 

Методи керування потоками.

У наступній таблиці наводяться методи, за допомогою яких можна керувати окремими потоками.

 

Метод Результат
Start Запускає потік на виконання
Sleep Призупиняє потік на певний час.
Suspend Призупиняє потік, коли він досягає безпечної точки
Abort Зупиняє потік, коли він досягає безпечної точки
Resume Відновлює роботу призупиненого потоку
Join Призупиняє поточний потік до тих пір, поки не буде завершено інший потік. При заданому часу очікування цей метод повертає значення True за умови, що інший потік закінчиться за цей час.

 

 

Створимо простий консольний додаток (рис.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 мс.

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.012 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал