- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Windows 10(64 位)上安装了 64 位 Lazarus 1.6/FPC 3.0,并移植了包含 InterlockedCompareExchangePointer
函数的 Delphi 代码。
FPC 3.0 不包含 InterlockedCompareExchangePointer
声明;相反,它“重载”了 InterlockedCompareExchange
,如 systemh.inc
中所示:
function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; public name 'FPC_INTERLOCKEDCOMPAREEXCHANGE';
{$ifdef cpu64}
function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comperand: int64): int64; public name 'FPC_INTERLOCKEDCOMPAREEXCHANGE64';
function InterlockedCompareExchange(var Target: Pointer; NewValue: Pointer; Comperand: Pointer): Pointer; external name 'FPC_INTERLOCKEDCOMPAREEXCHANGE64';
{$else cpu64}
function InterlockedCompareExchange(var Target: Pointer; NewValue: Pointer; Comperand: Pointer): Pointer; external name 'FPC_INTERLOCKEDCOMPAREEXCHANGE';
{$endif cpu64}
现在我尝试将 InterlockedCompareExchange
与指针一起使用:
program Project1;
uses Windows;
function Test: Boolean;
var
P1, P2: Pointer;
begin
Result:= InterlockedCompareExchange(P1, P2, nil) <> nil
end;
begin
Test;
end.
并且它不与消息一起编译
project1.lpr(10,50) Error: Incompatible type for arg no. 3: Got "Pointer", expected "LongInt"
所以显然“过载”不起作用。如何解决?
我在默认(64 位)目标上使用 64 位 FPC 3.0。
最佳答案
以下解决方法
{$ifdef fpc}
function InterlockedCompareExchangePointer(var Target: Pointer; NewValue: Pointer; Comperand: Pointer): Pointer;
begin
{$ifdef cpu64}
Result:= Pointer(InterlockedCompareExchange64(int64(Target), int64(NewValue), int64(Comperand)));
{$else cpu64}
Result:= Pointer(InterlockedCompareExchange(LongInt(Target), LongInt(NewValue), LongInt(Comperand)));
{$endif cpu64}
end;
{$endif fpc}
编译并确保Delphi/FPC兼容性;看起来缺少 InterlockedCompareExchangePointer
声明是 FPC 错误,应该修复。
关于delphi - FPC 3.0 和 InterlockedCompareExchange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36417627/
我无法理解 MSDN 文档对 Interlocked Variable Access 的含义函数族。我用 InterlockedExchange用于设置和 InterlockedCompareExch
我正在尝试使用 c++( native )为 64 位处理器运行 android 应用程序,当我执行这些函数时,我遇到了崩溃问题(总线错误) // returns the resulting
我不能在这里使用 C++11 原子 我对使用 InterlockedCompareExchange() 来“原子地”读取变量有疑问。 我问了一个关于这个的问题here ,但我在那里做的是不同的。 “e
假设架构是 ARM64 或 x86-64。 我想确定这两个是否等价: a = _InterlockedCompareExchange64((__int64*)p, 0, 0); MyBarrier()
我正在尝试使用互锁操作使以下代码片段无锁,知道如何翻译吗? if (m_Ref == 0xFFFF) m_Ref = 1; else { if (++m_Ref == 1)
我已经使用 InterlockedExchange 编写了一个基本的自旋锁(见下文)。然而,我已经看到很多实现都使用 InterlockedCompareExchange。我的方法是否以某种不可预见的
InterlockedCompareExchangeRelease() 和 InterlockedCompareExchangeAcquire() 之间有什么区别? 当我尝试学习WIN32 API的同
我在 Windows 10(64 位)上安装了 64 位 Lazarus 1.6/FPC 3.0,并移植了包含 InterlockedCompareExchangePointer 函数的 Delphi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
Microsoft 提供 InterlockedCompareExchange用于执行原子比较和交换操作的函数。还有一个_InterlockedCompareExchange 内在。 在 x86 上,
我在一台装有 mingw64 和所有相关软件包的 fedora 19 x86_64 计算机上。我当时在做一个个人的 c++ 项目,我决定让它成为线程安全的,所以我决定尝试一下 Boost.thread
我是一名优秀的程序员,十分优秀!