Что такое многопоточность?

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

Условия гонки.

Потоки, использующие общие переменные, в отличие от процесса. Так что это приводит к большим проблемам.

Представьте, что у вас есть 2 потока и одна переменная. Что произойдет, если все ваши потоки получат доступ к одному и тому же коду и изменят переменную одновременно. это звучит состояние гонки на развитии.

private static void RaceConditionExample()
{
    Thread firstThread = new Thread(() =>
    {
        Add();
    });
    Thread secondThread = new Thread(() =>
    {
        Add();
    });
    firstThread.Start();
    secondThread.Start();
    foreach (var num in nums)
    {
        Console.Write(num); // 1 2 3 4 5 5 5
    }
}
private void Add()
{ 
   //Collection elements inline initialization
   List<int> nums = new List<int> { 1, 2, 3, 4, 5 };
   nums.Add(nums.Count);
}

Add Method на самом деле является критическим разделом. Все потоки хотят достичь метода Add, поэтому на самом деле это состояние гонки. Они соревнуются друг с другом, чтобы достичь метода Add.

Плюсы и минусы многопоточности.

Многопоточные приложения имеют следующие преимущества:

  • Улучшенная производительность и параллелизм.Для некоторых приложений производительность и параллелизм можно улучшить с помощью многопоточности. В других приложениях производительность может остаться неизменной или даже ухудшиться при использовании многопоточности. Влияние на производительность зависит от вашего приложения.
  • Отзывчивость.Многопоточность в интерактивном приложении может позволить программе продолжать работу, даже если ее часть заблокирована или выполняется длительная операция, тем самым повышая отзывчивость для пользователя.
  • Совместное использование ресурсов. Процессы могут совместно использовать ресурсы только с помощью таких методов, как:
  • Передача сообщений
  • Общая память

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

Многопоточные приложения имеют следующие недостатки:

  • Сложные процессы отладки и тестирования
  • Накладное переключение контекста
  • Повышенный уровень сложности при написании программы
  • Непредсказуемые результаты. Многопоточные программы иногда могут приводить к непредсказуемым результатам, поскольку они, по сути, представляют собой несколько частей программы, которые выполняются одновременно.
  • Сложности с переносом существующего кода. Для переноса существующего кода в многопоточном режиме требуется много тестов.