Синхронизация в многопоточных приложениях MFC

ОГЛАВЛЕНИЕ

Введение в концепции и методы синхронизации в многопоточных приложениях

Введение

В данной статье обсуждаются основные принципы и методы, которые должны быть полезны для начинающих в многопоточном программировании. Речь идет не о людях, начинающих изучать язык C++, а о тех, кто только начинает знакомство с многопоточным программированием. Большая часть этой статьи посвящена методам синхронизации. То есть статья фактически является руководством по синхронизации.

Общий обзор

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

Все формы взаимодействий можно описать с помощью элементов (объектов) синхронизации, которые могут поддерживаться различными способами. Наиболее часто используемыми являются те, которые предназначены в первую очередь для непосредственной поддержки синхронизации. Синхронизацию поддерживают следующие объекты (это не полный список):

  • Семафоры
  • Взаимоисключающие блокировки
  • Критические секции
  • События

Каждый из этих объектов применяется для различных специальных целей и задач, но общей их задачей является поддержка синхронизации. Это будет описано позже в данной статье. Есть и другие объекты, которые можно использовать в качестве среды для синхронизации, такие как объект Process (процесс) и Thread (поток). Их использование позволяет программисту определять, например, закончил данный процесс или поток выполняться или еще нет.

Чтобы применять объекты Process и Thread для задач синхронизации, мы должны использовать ожидающие функции. Перед тем как начать изучать эти функции, вам нужно понять то, что любой объект ядра, который можно использовать как объект синхронизации, может находиться в одном из двух состояний: сигнализирующем состоянии и  не сигнализирующем состоянии. За исключением критических секций, все объекты синхронизации могут быть в одном из этих двух состояний. Например, что касается объектов Process и Thread, они находятся в не сигнализирующем состоянии, когда начинают выполняться, и переходят в сигнализирующее состояние, когда заканчивают свое выполнение. Чтобы определить, закончилось ли выполнение данного процесса или потока, мы должны выяснить, когда представляющие их объекты находятся в сигнализирующем состоянии; чтобы реализовать это, мы должны разобраться с ожидающими функциями.