Lektsia_10VP
.pdfМногопоточность и распараллеливание.
Взаимоисключение (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