створення потоку

Виконання коду в С # нд ?? егда починається з методу Main. Метод Main - утворює головний потік програми. Потік являє собою послідовність операцій виконуваних у програмі. Головний потік може запустити кілька подчин ?? енних або говорять робочих потоків. У кожному потоці виконується одна, яка-небудь функція. Кажуть, що в даному випадку програма распараллеливается, т. Е. Розпадається на кілька потоків, які виконуються паралельно. На самому справ ?? е на однопроцессорной ЕОМ нд ?? е потоки виконуються невеликими опціями послідовно один за одним, за рахунок чого у користувача створюється ілюзія їх паралельної роботи. Реальний виграш за часом виходить тільки коли потоки використовують різні апаратні ресурси ЕОМ або / і на багатопроцесорних машинах.

Багатопотокова система Інкапсульована в клас Thread. Даний клас оголошений як запечатаний (sealed) клас, тобто від нього не можна породити новий клас. У класі Thread определ ?? ено ряд властивостей і методів для управління потоками.

Важливо зауважити, що для створення потоку вкрай важливо створити об'єкт класу Thread.

Один з конструкторів цього класу має такий вигляд:

public Thread (ThreadStart start)

Тип ThreadStart оголошений в просторі імен System.Threading за допомогою ключового слова delegate і має наступну сигнатуру:

public delegate void ThreadStart ();

Нехай, наприклад, заголовок потокової функції - void funcThread (), тоді створення об'єкта start:

ThreadStart start = new ThreadStart (funcThread);

Конструктору справ ?? егата ThreadStart при створенні об'єкта передається ім'я функції, яка буде виконуватися в потоці.

Наступним кроком вкрай важливо створити потоковий об'єкт, передавши конструктору класу Thread об'єкт start в якості параметра:

Thread thrd = new Thread (start);

Після створення потокового об'єкта вкрай важливо запустити потокову функцію на виконання шляхом виклику методу Start, використовуючи посилання thrd:

Потоковому об'єкту за допомогою властивості Name можна привласнити неĸᴏᴛᴏᴩᴏᴇ ім'я:

strig nm = thrd.Name;

Потік вважається активним, не залежно від того чи знаходиться він в стані зупинки чи ні, до тих пір, поки не завершиться запущена в ньому функція. Після завершення потокової функції потік знищується. Таке завершення роботи потоку вважається нормальним. Дізнатися, чи перебуває потік в активному стані чи ні можна за допомогою властивості IsAlive, доступного тільки для читання. Властивість повертає значення true, у разі якщо потік активний і брехня (false), в разі якщо немає. Це властивість можна використовувати для определ ?? ення моменту закінчення роботи потоку. Призупинити роботу потоку на определ ?? енное час можна за допомогою статичного методу:

public static void Sleep (int time)

класу Thread, де параметр time задає час в мілісекундах.

Для закріплення матеріалу розглянемо приклад, який демонструє викладений матеріал:

Console.WriteLine ( "Головний потік завершено.");

У цьому додатку оголошений клас MyThread. Конструктор класу MyThread створює потоковий об'єкт за допомогою рядка коду:

thrd = new Thread (new ThreadStart (this.FnThr));

Потім потоковому об'єкту присвоюється ім'я, ĸᴏᴛᴏᴩᴏᴇ конструктор приймає як параметр і запускається за допомогою методу Start () потік, що призводить до виклику потокового методу FnThr ().

У методі FnThr () організований цикл, який "вважає" від 0 до 4. До входу в цикл метод виводить на консоль ім'я стартував потоку, а після закінчення циклу - ім'я завершив свою роботу потоку. Виклик методу Sleep (), в тел ?? е циклу методу FnThr () змушує потік, з якого він був викликаний, призупинити виконання на період часу, заданий в мілісекундах.

У методі Main () при виконанні наступних інструкцій створюється п'ять об'єктів класу Thread:

// Створюємо масив посилань на потокові об'єкти

MyThread [] mt = new MyThread [5];

// Створюємо об'єкти класу MyThread.

for (int j = 0; j

mt [j] = new MyThread ( "Нащадок #" + j.ToString ());

Після створення потоків і запуску їх на виконання в конструкторі класу MyThread. в додатку виконуються основний потік, а, саме, метод Main () і п'ять дочірніх потоків.

За допомогою циклу:

for (int j = 0; j

live = live | mt [j] .thrd.IsAlive;

метод Main () чекає завершення роботи потоків.

У наведеному прикладі завершення роботи потоку визначався за допомогою методу IsAlive (). Другий спосіб, які дозволяє "дочекатися" завершення виконання потоку, складається у виклику методу Join ().

Метод Join () очікує, поки потік, для якого він був викликаний, не завершиться. При роботі з цим методом вкрай важливо проявляти обережність. Метод Join () не можна викликати до запуску нд ?? ех потоків, які повинні працювати паралельно. Справа в тому, що виклик методу Join () викликає блокування запуску ще не запущених потоків до моменту завершення роботи вс ?? ех потоків, для яких був викликаний даний метод.

Читайте також

ПОТОКИ Існують різні визначення терміна "потік", в тому числі "одиниця виконання", "окремий лічильник команд" або "що підлягає плануванню сутність всередині процесу". Хоча кожне з цих визначень по суті своїй правильно, жодне з. [Читати далі].

ПОТОКИ Існують різні визначення терміна "потік", в тому числі "одиниця виконання", "окремий лічильник команд" або "що підлягає плануванню сутність всередині процесу". Хоча кожне з цих визначень по суті своїй правильно, жодне з. [Читати далі].

Робота з файлами Приклад роботи з файлом Загальні відомості Потоки для роботи з файлами Організація роботи з файлами Для роботи з файлами в мові C ++ використовуються потоки трьох видів: · потік введення. [Читати далі].

Схожі статті