Несколько вопросов о потоках - PullRequest
0 голосов
/ 25 августа 2018

Я новичок в параллельном программировании, потоках, задачах и т. Д. Итак, я читал на днях, и книга познакомила меня с Threading.Это не объясняло это так хорошо, поэтому я был немного погружен в концепцию.У меня есть пара вопросов:

  1. Являются ли потоки асинхронными по умолчанию?Потому что, когда мы запускаем несколько потоков, он запускается и не останавливает какие-либо другие потоки или задачи, делая их асинхронными, я думаю.

  2. Как работает агрегатное исключение?Я имею в виду, как мы справимся с этим, как это случилось?Пожалуйста, дайте мне пример.

  3. Что такое контексты синхронизации?Я посмотрел в Интернете и увидел так много определений.Некоторые пытаются использовать умные звучащие слова, которые просто вызывают путаницу в моем мозгу.

Я слышал, что все эти понятия сложны.Усложнение заставляет меня узнать об этом еще больше.

1 Ответ

0 голосов
/ 25 августа 2018

Простыми словами:

  1. Да, они по умолчанию асинхронные, поскольку внутренне основаны на вытесняющем многозадачном механизме.То есть в любой точке выполнения поток может быть «прерван» выполнением другого потока, если вы не применяете явные механизмы синхронизации (такие как мьютекс, критическая секция, семафора и т. Д.), Из-за чего потоки помещаются в очередь в «очередь выполнения».«когда они достигают точки с синхронизацией.Так что да, поток не останавливает другие потоки, если они не сталкиваются с одним и тем же объектом синхронизации.

  2. AggregateException - это всего лишь механизм для обертывания нескольких исключений из дочерних задач родительской задачи.Задача может иметь дочерние задачи, если они выполняются изнутри этой задачи и если эти дочерние задачи определены как прикрепленные, все сбои внутри них объединяются в единый объект, который может быть перехвачен в точке ожидания родительской задачи.Вот пример агрегации исключений:

        var task = Task.Factory.StartNew(() =>
        {
            Console.WriteLine("Parent task");
            var subTask = Task.Factory.StartNew(
                () =>
                {
                    Console.WriteLine("Child");
                    throw new Exception("Exception in the child");
                }, TaskCreationOptions.AttachedToParent);
            throw new Exception("Exception in the parent");
        });
    
        try
        {
            task.Wait();
        }
        catch (AggregateException e)
        {
            Console.WriteLine(e);
        }
    

    Исключение, пойманное в блоке catch, будет содержать исключения из обеих задач, поскольку дочерняя задача была создана с опцией AttachedToParent.

  3. Вы можете рассматривать контекст синхронизации как абстракцию для выполнения некоторой единицы работы.На самом деле он предоставляет два метода: Send и Post, которые получают некоторый делегат для выполнения (синхронно или асинхронно) в качестве аргумента.По умолчанию он планирует выполнение переданного делегата в пуле потоков в случае асинхронной семантики (Post) или просто выполняет его непосредственно в случае синхронной семантики (Send).Зачем это нужно?Абстракция дает возможность представить другие реализации единицы выполнения работы.Например, есть реализации, которые внутренне используют насос сообщений для планирования всего выполнения в определенном потоке, что может быть полезно для задач пользовательского интерфейса для Windows Forms или WPF.Или вы можете реализовать свой собственный контекст синхронизации, например, чтобы последовательно выполнять некоторые задачи или просто создавать более сложные сценарии.Существует конкретная реализация TaskScheduler, называемая SynchronizationContextTaskScheduler, которая работает поверх SynchronizationContext (то есть запланирует выполнение в контексте синхронизации), и эти две абстракции предоставляют гибкий механизм для соответствия любым требованиям синхронизации выполнения.В качестве конкретного примера применения механизм async / await внутренне использует SynchronizationContext для планирования продолжений асинхронных операций.Благодаря множеству контекстов синхронизации он может работать прозрачно независимо от используемой платформы (Win Forms, WPF, ASP.NET, Console App и т. Д.), Просто используя правильную реализацию SynchronizationContext.

...