Другие функции взаимоблокировки

Другие функции взаимоблокировки

Ранее уже было продемонстрировано, что функции InterlockedIncrement и InterlockedDecrement могут пригодиться в тех случаях, когда все, что требуется — это выполнение простейших операций над переменными, доступ к которым разделяется несколькими потоками. Используя некоторые другие функции, вы можете выполнять атомарные операции, позволяющие осуществлять сравнение и обмен значениями пар переменных.

Функции взаимоблокировки настолько же полезны, насколько и эффективны; эти функции реализуются в пользовательском пространстве с применением всего лишь нескольких машинных команд.

Функция InterlockedExchange сохраняет значение одной переменной в другой. 

LONG InterlockedExchange(LPLONG Target, LONG Value) 

Эта функция возвращает текущее значение переменной, на которую указывает параметр Target, и устанавливает значение этой переменной равным Value. Функция InterlockedExchangeAdd прибавляет второе значение к первому. 

LONG InterlockedExchangeAdd(PLONG Addend, LONG Increment) 

Значение Increment прибавляется к значению переменной, на которую указывает параметр Addend, а начальное значение этой переменной возвращается функцией. Данная функция позволяет увеличивать значение переменной на 2 (и более) атомарным образом, чего невозможно добиться последовательными вызовами функции InterlockedIncrement.

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

PVOID InterlockedCompareExchange(PVOID *Destination, PVOID Exchange, PVOID Comparand) 

Эта функция выполняет атомарным образом следующие действия (использование типа данных PVOID для двух последних параметров может казаться вам непонятным):

Temp = *Destination;

if (*Destination == Comparand) *Destination = Exchange;

return Temp;

Одним из вариантов применения этой функции является управление блокировкой с целью реализации критического участка кода. *Destination является переменной блокировки (lock variable), причем значению 1 соответствует разблокированное состояние, а значению 0 — блокированное. Значение Exchange задается равным 0, a Comparand — 1. Вызывающему потоку известно, что она владеет критическим участком, если функция возвращает 1. В противном случае вызывающий поток должен "уснуть", или выполнить ожидание в состоянии занятости ("spin"), то есть совершать в течение короткого промежутка времени цикл, в котором ничего не делается, с той только целью, чтобы выждать некоторое время, а затем вновь повторить попытку. По существу, именно такой цикл и выполняет функция EnterCriticalSection, ожидая перехода в сигнальное состояние объекта CRITICAL_SECTION с ненулевым значением спин-счетчика; для получения более подробной информации по этому вопросу обратитесь к главе 9.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

10.1.2.6 Другие функции, имеющие отношение к файловой системе

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

10.1.2.6 Другие функции, имеющие отношение к файловой системе Такие функции работы с файловой системой, как stat и chmod, выполняются одинаково, как для обычных файлов, так и для устройств; они манипулируют с индексом, не обращаясь к драйверу. Даже системная функция lseek работает


Другие функции базы данных

Из книги Основы AS/400 автора Солтис Фрэнк

Другие функции базы данных DB2/400 поддерживает и несколько дополнительных функций. Некоторые из них расширяют возможности применения AS/400 в клиент/серверных системах и средах распределенных баз данных, другие призваны повысить производительность базы данных. В этом


Другие функции кучи

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Другие функции кучи Функция HeapCompact пытается уплотнить, или дефрагментировать, смежные блоки в куче. Функция HeapValidate пытается обнаруживать повреждения кучи. Функция HeapWalk перечисляет блоки в куче, а функция GetProcessHeaps получает все действительные дескрипторы куч.Функции HeapLock


Функции взаимоблокировки

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

Функции взаимоблокировки Если все, что требуется — это увеличение, уменьшение или обмен значениями переменных, как в нашем первом простом примере, то функций взаимоблокировки (interlocked functions) вам будет вполне достаточно. Функции взаимоблокировки проще в использовании,


Мьютексы, критические участки кода и взаимоблокировки

Из книги Справочник по PHP автора

Мьютексы, критические участки кода и взаимоблокировки Несмотря на то что объекты CS и мьютексы обеспечивают решение задач, подобных той, которая иллюстрируется на рис. 8.1, при их использовании следует соблюдать осторожность, иначе можно создать ситуацию взаимоблокировки


9.4.3 Другие функции UDP

Из книги Технология XSLT автора Валиков Алексей Николаевич

9.4.3 Другие функции UDP Кроме отправки и получения датаграмм, UDP должен руководствоваться здравым смыслом при пересылке данных вниз, от приложения к IP, и обеспечивать указание на ошибки от IP к


Другие функции

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Другие функции ftruncateУсекает файл.Синтаксис:bool ftruncate(int $f, int $newsize)Эта функция усекает открытый файл $f до размера $newsize. Разумеется, файл должен быть открыт в режиме, разрешающим запись.Например, следующий код очищает весь файл:ftruncate($f,0);fflushНемедленная запись всех изменений в


Другие функции

Из книги Язык Си - руководство для начинающих автора Прата Стивен

Другие функции session_is_registeredПроверяет, зарегистрирована или нет та или иная переменная.Синтаксис:bool session_is_registered(string $name)Функция возвращает true, если переменная с именем $name была зарегистрирована в сессии, иначе возвращает false.session_unregisterОтменяет регистрацию


Другие дополнительные функции XSLT

Из книги Недокументированные и малоизвестные возможности Windows XP автора Клименко Роман Александрович

Другие дополнительные функции XSLT Функция current Выражение для этой функции имеет вид:node-set current()Функция current возвращает множество, состоящее из текущего узла преобразования.Мы часто использовали термины текущий узел и узел контекста как синонимы: действительно, в


Другие функции

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

Другие функции Функция Краткое описание assert проверка утверждения о состоянии переменных getenv получить значение переменной среды (окружения) perror напечатать сообщение об ошибке putenv изменить значение переменной среды swab поменять местами два смежных


ДРУГИЕ БИБЛИОТЕЧНЫЕ ФУНКЦИИ

Из книги C++ для начинающих автора Липпман Стенли

ДРУГИЕ БИБЛИОТЕЧНЫЕ ФУНКЦИИ      Большинство библиотек будут выполнять и ряд дополнительных функций в тех случаях, которые мы рассмотрели. Кроме функций, распределяющих память, есть функции, освобождающие память после работы с нею. Могут быть другие функции, работающие


Другие классы и функции пространств имен WMI

Из книги Разработка ядра Linux автора Лав Роберт

Другие классы и функции пространств имен WMI WMI является неисчерпаемой темой для обсуждения, так как содержит просто огромное количество классов, не говоря уже о количестве функций, реализованных в этих классах. Для рассмотрения всех функций WMI (не говоря уже об объектах


4.4.3. Взаимоблокировки исключающих семафоров

Из книги автора

4.4.3. Взаимоблокировки исключающих семафоров Исключающие семафоры являются механизмом, позволяющим одному потоку блокировать выполнение другого потока. Это приводит к возникновению нового класса ошибок. называемых взаимоблокировками или тупиковыми ситуациями. Смысл


4.4.7. Взаимоблокировки двух и более потоков

Из книги автора

4.4.7. Взаимоблокировки двух и более потоков Взаимоблокировка происходит, когда два (или более) потока блокируются в ожидании события, наступление которого на самом деле зависит от действий одного из заблокированных потоков. Например, если поток A ожидает изменения


Взаимоблокировки

Из книги автора

Взаимоблокировки Взаимоблокировка (тупиковая ситуация, deadlock) — это состояние, при котором каждый поток ожидает на освобождение одного из ресурсов, а все ресурсы при этом захвачены. Потоки будут ожидать друг друга, и они никогда не смогут освободить захваченные ресурсы.