Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lektsia_10VP

.pdf
Скачиваний:
4
Добавлен:
27.05.2015
Размер:
724.2 Кб
Скачать

Многопоточность и распараллеливание.

Взаимоисключение (mutex)СемафорыСобытияКритические секции

2

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

Не делайте никаких предположений о какой-либо корреляции между потоками операционной системы и управляемыми потоками.

3

Запуск потоков.

using System;

using System.Threading;

public class EntryPoint

{

private static void ThreadFunc()

{

Console.WriteLine("Привет из потока {0} ({1})!", Thread.CurrentThread.GetHashCode(), Thread.CurrentThread.ManagedThreadId);

}

static void Main()

{

// Создание нового потока.

Thread newThread =

new Thread(new ThreadStart(EntryPoint.ThreadFunc));

4

Console.WriteLine("Главный поток - {0}", Thread.CurrentThread.ManagedThreadId);

Console.WriteLine("Запуск нового потока...");

//Запуск нового потока. newThread.Start();

//Ожидание завершения работы нового потока. newThread.Join();

Console.WriteLine("Новый поток завершен."); Console.ReadLine();

}

}

ThreadStart

5

Получить идентификатор управляемого потока можно с помощью свойства Thread.ManagedThreadId.

Обратите внимание на вызов метода Join объекта newThread.

На самом деле GetHashCode и ManagedThreadId берутся из одного и того же места. ManagedThreadId делает код более читабельным, потому что более адекватно отображает его суть.

6

Завершение потоков

Thread.Abort() ThreadAbortException

using System;

using System.Threading; public class EntryPoint

{

private static void ThreadFunc()

{

ulong counter = 0; while (true)

{

try

{

Console.WriteLine("{0}", counter++);

}

7

catch (ThreadAbortException)

{

// Попытка проглотить исключение и продолжить.

Console.WriteLine("Прекратить!");

}

}

}

static void Main()

{

Thread newThread =

new Thread(new ThreadStart(EntryPoint.ThreadFunc)); newThread.Start();

Thread.Sleep(30);

// Прервать поток. newThread.Abort();

8

// Дождаться завершения потока. newThread.Join(); Console.ReadLine();

}

}

Используя Thread.ResetAbort()

Ожидание завершения потока

Suspend()

Interrupt()

Abort()

Потоки переднего плана и фоновые потоки

9

using System;

using System.Threading; public class EntryPoint

{

private static void ThreadFuncl()

{

Thread.Sleep(5000);

Console.WriteLine("Завершение дополнительного потока");

}

static void Main()

{

Thread thread1 =

new Thread(new ThreadStart(EntryPoint.ThreadFuncl));

thread1.Start();

Console.WriteLine("Завершение главного потока");

}

}

10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]