Создание Windows-приложений на основе Visual C#

         

Меры безопасности в многопоточных приложениях


При использовании асинхронной модели программирования не исключена ситуация, когда два или более потоков начнут использовать один объект, что может привести к непредвиденным обстоятельствам и ошибкам. Пространство имен System.Threading включает в себя классы для управления синхронизацией доступа и обеспечения потоковой безопасности.

Самые распространенные проблемы, возникающие при использовании многопоточной модели программирования, — это "Гонка" (Race condition) и "Мертвая точка" (Deadlock).

Проблема "Гонки" встречается, когда два или более потоков начинают использовать одновременно один объект. Например, в то время как один поток считывает данные из структуры, другой может начать изменять ее. После выполнения этих операций неизвестно, какие данные считал первый поток: старые, новые или перемешанные.

Проблема "Мертвой точки" возникает при синхронизации в многопоточных приложениях, когда два потока ожидают выполнения или освобождения ресурсов друг друга. К примеру, два потока переводят деньги со счета А в счет В и обратно. Первый поток запрограммирован сделать следующее:

  1. ожидать освобождения и заблокировать счет А;
  2. ожидать освобождения и заблокировать счет В;
  3. перевести деньги;
  4. разблокировать потоки.

Второй поток выполняет те же действия, за исключением того, что сперва блокируется счет В, а затем А. Итак, первый поток заблокировал счет А, а в это время второй поток заблокировал счет В. После этого каждый поток будет ждать, пока другой не освободит ресурсы, но этого не произойдет.

Одним из решений этих проблем является закрытие общего доступа к объектам между потоками. Но иногда приходится использовать одни переменные в многопоточных приложениях. Для таких целей в пространстве имен System.Threading находятся классы, помогающие осуществить синхронизацию объектов.



Содержание раздела