Эй, Я ответил на несколько вопросов, связанных с этим, также имейте в виду;
- Существует NO уровень байтов InterlockedExchange там IS 16-битный короткий Однако InterlockedExchange.
- Дискретность документации, на которую вы ссылаетесь, вероятно, просто недосмотр документации.
- Если вы хотите сделать атомарный доступ на уровне байтов / бит, есть ARE множество способов сделать это с существующими внутренними компонентами, Interlocked [And8 | Or8 | Xor8]
- Любая операция, при которой вы выполняете блокировку с высокой производительностью (с использованием кода, который вы обсуждали), не должна выполняться без выравнивания ( производительность анти-паттерна )
- xchg (оптимизированная инструкция с неявным префиксом LOCK, оптимизированная благодаря возможности кешировать блокировку и избежать полной блокировки шины для основной памяти). МОЖЕТ делать 8-битные операции с блокировкой.
Я чуть не забыл, от Intel TBB , они имеют определение Load / Store 8bit без использования явной или явной блокировки (в некоторых случаях);
.code
ALIGN 4
PUBLIC c __TBB_machine_load8
__TBB_machine_Load8:
; If location is on stack, compiler may have failed to align it correctly, so we do dynamic check.
mov ecx,4[esp]
test ecx,7
jne load_slow
; Load within a cache line
sub esp,12
fild qword ptr [ecx]
fistp qword ptr [esp]
mov eax,[esp]
mov edx,4[esp]
add esp,12
ret
EXTRN __TBB_machine_store8_slow:PROC
.code
ALIGN 4
PUBLIC c __TBB_machine_store8
__TBB_machine_Store8:
; If location is on stack, compiler may have failed to align it correctly, so we do dynamic check.
mov ecx,4[esp]
test ecx,7
jne __TBB_machine_store8_slow ;; tail call to tbb_misc.cpp
fild qword ptr 8[esp]
fistp qword ptr [ecx]
ret
end
Во всяком случае, надеюсь, что это прояснит для вас кое-что.