Win32 上的互锁操作与 XXX::atomic

Posted

技术标签:

【中文标题】Win32 上的互锁操作与 XXX::atomic【英文标题】:Interlocked ops vs XXX::atomic on Win32 【发布时间】:2010-11-26 13:27:06 【问题描述】:

在Win32平台上使用Interlocked winapi函数代替任何提供原子操作的库有什么优缺点?

便携性不是问题。

【问题讨论】:

【参考方案1】:

如果可移植性不是问题,那么您基本上可以决定更信任谁来完成这项工作。库通常旨在提供可移植性。否则,它很难与经过 15 年多的实战考验的操作系统提供的实现竞争。

查看this thread 以查看一个示例,说明显而易见的实现实际上并不是最好的。

【讨论】:

嗯,比如Intel的TBB::atomic。微软提供操作系统,而英特尔生产处理器。你会更信任谁? 呵呵,你相信 Intel 代码可以在 AMD 处理器上正常运行吗? 让我们假设代码将始终在英特尔处理器上运行,这在我的情况下是正确的。【参考方案2】:

即使没有 CPU 支持锁定操作,Interlocked winapi 函数也可以在旧处理器上工作。 386 或者 486,除非您仍然支持 Win9x 和旧版 NT,否则今天不是真正的问题。

【讨论】:

它们在这些 CPU 上的工作方式不同。 (相对于其他互锁操作而言,它们只是原子操作)【参考方案3】:

这可能取决于所讨论的特定原子库。

具有特定后端的好的库可能最终会以相同的 ASM 指令实现来发出 x86 lock 指令并完成它们的工作。并假设库本身是可移植的,然后使您的代码可移植。

一个天真的原子实现可能做一些更重的事情,比如使用互斥锁来保护一个正常的变量。我不知道有什么做的——只是提出论点。

因此,鉴于您声明的不可移植性要求,使用 Win32 函数应该没问题。或者,继续使用 Atomic 版本,但也许看看实际的实现。

【讨论】:

以上是关于Win32 上的互锁操作与 XXX::atomic的主要内容,如果未能解决你的问题,请参考以下文章

32 位 int 类型的 Win API 互锁操作

结构的互锁交换

用于增加/模仿布尔值的互锁,这安全吗?

如何在 .net 中对 MemoryMappedFiles 使用 x64 互锁操作

C#调用Win32 api时的内存操作

PWA 与 Android 应用程序/服务的互操作性?