_InterlockedOr8 - встроенная функция компилятора, уникальная для компилятора Microsoft - это означает, что компилятор автоматически внедряет реализацию в код вместо связывания с библиотекой. <intr.h>
- это файл заголовка, распространяемый вместе с Visual Studio, отдельно от Windows SDK.
Если вы не можете переключиться на Visual Studio (free download, btw), то вы можете определить свою собственную версию замены этой функции:
void InterlockedOr8(char* dst, char src)
{
__asm
{
mov eax, dst ; EAX = dst
mov cl, src ; ECX = src
lock or [eax], cl ; *dst = src | *dst; // this is the actual interlocked-or op
}
}
Обратите внимание, что эта функция отличается от _InterlockedOr8 в том, что она Безразлично» t вернуть исходное значение * dst. Реализация становится более сложной, если вам нужно вернуть значение. Я быстро взглянул на источник SyncSys. Два места, которые нуждаются в этой функции, не нуждаются в возвращаемом значении. Итак, все, что вам нужно сделать, это преобразовать приведенный выше код, чтобы использовать gcc-стиль встроенной сборки.
Update
Вот версия, которая правильно возвращает исходное значение в адресе назначения до операции ИЛИ. Это, вероятно, может использовать немного код обзора критики ...
char MyInterlockedOr8(char* dst, char src)
{
char result = 0;
const size_t ptr_size = sizeof(dst);
_asm
{
mov esi, dst ; esi = dst
mov cl, src ; cl = src // keep "src" cached in a register
mov al, [esi] ; al = *dst
start:
mov bl, cl ; bl = src
or bl, al ; bl = src | *dst
lock cmpxchg [esi], bl; // if (*dst == eax) { *dst=bl ;} else {al = *dst};
jne start
mov result, al ; result = al
}
return result;
}
Я мог бы перейти к VS, я VS уже установлен, но я не люблю IDE и если установить компилятор в CodeBlocks для MSVC10 У меня нет отладчика и cl.exe всегда выдает D8003-Ошибки. Я никогда не смотрел на ассемблер, поэтому я понятия не имею, что происходит в вашем коде, поэтому было бы здорово, если бы вы могли добавить некоторые подсказки/комментарии и спасибо за вашу помощь. – JoshuaBehrens
Я также посмотрел на код, вы правы, что он не заботится о возвращаемом значении, но _InterlockedAnd8 должен вернуть правильное значение, потому что оно используется. Я просто догадался, что код для _InterlockedAnd8 должен быть: void _InterlockedAnd8 (volatile char * dst, char src) {asm ("mov eax, dst; mov cl, src; lock и [eax], cl;"); } Я прав? – JoshuaBehrens
Более или менее. Но если код действительно использует возвращаемое значение из InterlockedOr8 (которое является значением, на которое указывает dst перед свопом), сгенерированный ассемблерный код становится немного больше и делает использование вызова с блокировкой-обменом обменом. – selbie