Параллельные потоки - это такие потоки, если они существуют одновременно в вычислительной системе, но возможно в разных состояниях. Разделяют на: а) независимые и зависимые; б) синхронные и асинхронные. Последнее означает, что процессам необходимо периодически синхронизироваться и взаимодействовать, то есть обмениваться информацией (данными).
Использование разделяемых объектов: память, файлы, базы данных.
При асинхронном взаимодействии двух или более потоков через общий (разделяемый) объект данных могут возникнуть потери данных. Пример:
Обычно данные между процессами передаются через общее поле памяти, доступное для записи и чтения обоим процессам. Такие данные называются РАЗДЕЛЯЕМЫМИ. Для предотвращения ошибок данных необходимо исключить возможность одновременного обращения обоих процессов к разделяемым данным. Это называется ВЗАИМОИСКЛЮЧЕНИЕМ (MUTual EXclude, mutex). Обеспечение взаимоисключения является одной из ключевых проблем параллельного (многозадачного, многопоточного) программирования. Взаимоисключение необходимо ТОЛЬКО тогда, когда несколько процессов обращаются к разделяемым данным на запись (изменение данных). Во время такого обращения говорят, что процесс находится в своем
КРИТИЧЕСКОМ УЧАСТКЕ. Если один из процессов находится в своем критическом участке, другие процессы могут продолжать свое выполнение, но без входа в их собственные критические участки.
Способы взаимоисключения:
1) алгоритм Деккера (1960-й год).
2) использование специальных команд (неделимых команд, например, test_and_set(x,y), разновидность test_and_clr(…)).
3) предоставление ОС некоторого универсального объекта, например семафора (semaphore). Классические средство: семафор Дейкстры.