Что такое многопоточность?
Многопоточность — это метод выполнения программы, позволяющий использовать несколько сегментов кода в одном процессе. это также звучит как параллелизм.
Условия гонки.
Потоки, использующие общие переменные, в отличие от процесса. Так что это приводит к большим проблемам.
Представьте, что у вас есть 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.
Плюсы и минусы многопоточности.
Многопоточные приложения имеют следующие преимущества:
- Улучшенная производительность и параллелизм.Для некоторых приложений производительность и параллелизм можно улучшить с помощью многопоточности. В других приложениях производительность может остаться неизменной или даже ухудшиться при использовании многопоточности. Влияние на производительность зависит от вашего приложения.
- Отзывчивость.Многопоточность в интерактивном приложении может позволить программе продолжать работу, даже если ее часть заблокирована или выполняется длительная операция, тем самым повышая отзывчивость для пользователя.
- Совместное использование ресурсов. Процессы могут совместно использовать ресурсы только с помощью таких методов, как:
- Передача сообщений
- Общая память
Такие методы должны быть явно организованы программистом. Однако потоки совместно используют память и ресурсы процесса, которому они принадлежат по умолчанию.
Преимущество совместного использования кода и данных заключается в том, что это позволяет приложению иметь несколько потоков активности в одном и том же адресном пространстве.
Многопоточные приложения имеют следующие недостатки:
- Сложные процессы отладки и тестирования
- Накладное переключение контекста
- Повышенный уровень сложности при написании программы
- Непредсказуемые результаты. Многопоточные программы иногда могут приводить к непредсказуемым результатам, поскольку они, по сути, представляют собой несколько частей программы, которые выполняются одновременно.
- Сложности с переносом существующего кода. Для переноса существующего кода в многопоточном режиме требуется много тестов.