gpt4 book ai didi

c++ - gcc MinGW 上的 InterlockedOr8

转载 作者:行者123 更新时间:2023-11-28 07:11:18 28 4
gpt4 key购买 nike

我在使用 CodeBlocks 12.11 附带的 MinGW 版本时没有遇到任何问题。但现在我试图编译 SyncSys .编译 enet 没有问题,但是用 gcc/MinGW 编译 SyncSys 本身会带来错误,我不能使用函数 _InterlockedOr8 因为它没有声明。研究导致 _InterlockedOr8 在 intrin.h 中定义。 intrin.h 不包括在内,我在 MinGW/gcc 上搜索了它的等效项:x86intrin.h。但这仍然不起作用。 InterlockedOr8将是要调用的“真实”函数,但编译器也无法找到它,尽管包含 winbase.h 和 windows.h。

在研究这个问题时,很少有我无法从中学习的命中率。我该如何解决这个问题?

最佳答案

_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 的不同之处在于它不返回 *dst 的原始值。如果您需要返回值,实现会变得更加复杂。我快速查看了 SyncSys 源代码。需要该函数的两个地方不需要返回值。所以你所要做的就是将上面的代码转换为使用内联汇编的 gcc 风格。

更新

这是一个在 OR 操作之前正确返回目标地址内的原始值的版本。它可能需要一些代码审查审查......

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;
}

关于c++ - gcc MinGW 上的 InterlockedOr8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20930196/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com