Доступ к переменной с блокировкой
Приложения должны синхронизировать доступ к переменным, общим для нескольких потоков. Приложения также должны гарантировать, что операции с этими переменными выполняются атомарны (выполняются в полном объеме или вообще не выполняются).
Простые операции чтения и записи для правильно выровненных 32-разрядных переменных являются атомарными операциями. Другими словами, вы не в конечном итоге будете содержать только одну часть обновленной переменной; все биты обновляются атомарным образом. Однако доступ не гарантируется синхронизацией. Если два потока считывают и записываются из одной переменной, невозможно определить, будет ли один поток выполнять операцию чтения до выполнения другой операции записи.
Простые операции чтения и записи для правильно выровненных 64-разрядных переменных являются атомарными в 64-разрядной Windows. Операции чтения и записи в 64-разрядные значения не гарантированы атомарными в 32-разрядной версии Windows. Операции чтения и записи в переменные других размеров не гарантированы атомарными на любой платформе.
Межблокируемый API
Межблокированные функции предоставляют простой механизм синхронизации доступа к переменной, к которой используется несколько потоков. Они также выполняют операции с переменными атомарным образом. Потоки различных процессов могут использовать эти функции, если переменная находится в общей памяти.
Функции InterlockedIncrement и InterlockedDecrement объединяют шаги, связанные с увеличением или уменьшением переменной в атомарную операцию. Эта функция полезна в многозадачной операционной системе, в которой система может прерывать выполнение одного потока, чтобы предоставить срез времени процессора другому потоку. Без такой синхронизации два потока могут считывать одно и то же значение, увеличивать его на 1 и хранить новое значение для общего увеличения 1 вместо 2. Функции с заблокированным доступом к переменным защищаются от такой ошибки.
Функции InterlockedExchange и InterlockedExchangePointer атомарно обменивают значения указанных переменных. Функция InterlockedExchangeAdd объединяет две операции: добавление двух переменных и сохранение результата в одной из переменных.
InterlockedCompareExchange, InterlockedCompare64Exchange128и функции InterlockedCompareExchangePointer объединяют две операции: сравнение двух значений и хранение третьего значения в одной из переменных на основе результата сравнения.
InterlockedAnd, InterlockedOrи функции InterlockedXor атомарно выполняют операции AND, OR и XOR соответственно.
Существуют функции, специально предназначенные для выполнения 64-разрядного доступа к переменным для 64-разрядных значений и адресов памяти, и оптимизированы для использования в 64-разрядной версии Windows. Каждая из этих функций содержит "64" в имени; например, InterlockedDecrement64 и InterlockedCompareExchangeAcquire64.
Большинство взаимосвязанных функций обеспечивают полные барьеры памяти на всех платформах Windows. Существуют также функции, которые объединяют базовые операции доступа между заблокированными переменными с семантикой получения и выпуска памяти, поддерживаемой определенными процессорами. Каждая из этих функций содержит слово "Приобретение" или "Выпуск" в их именах; например, InterlockedDecrementAcquire и InterlockedDecrementRelease. Получение семантики памяти указывает, что операция памяти, выполняемая текущим потоком, будет видна перед попыткой любых других операций памяти. Семантика памяти выпуска указывает, что операция памяти, выполняемая текущим потоком, будет видна после завершения всех других операций памяти. Эти семантики позволяют принудительно выполнять операции памяти в определенном порядке. Используйте семантику получения при вводе защищенной области и семантике выпуска при выходе из него.
Связанные разделы