当前位置: 首页 > 面试题库 >

如何在Linux上执行可在x86,arm,GCC和icc上运行的原子操作?

岑熙云
2023-03-14
问题内容

今天,每个现代OS都提供一些原子操作:

  • Windows具有Interlocked*API
  • FreeBSD有 <machine/atomic.h>
  • Solaris有 <atomic.h>
  • Mac OS X具有 <libkern/OSAtomic.h>

像Linux一样的东西吗?

  • 我需要它在大多数Linux支持的平台上工作,包括:x86,x86_64和 arm
  • 我至少在GCC和Intel编译器上需要它。
  • 我不需要使用像glib或qt这样的3rd par库。
  • 我需要它才能在C ++中工作(不需要C)

问题:

  • GCC原子内建函数__sync_*并非在所有平台(ARM)上都受支持,并且英特尔编译器也不支持。
  • AFAIK <asm/atomic.h>不应在用户空间中使用,并且我还没有成功使用过。另外,我不确定它是否可以与Intel编译器一起使用。

有什么建议么?

我知道有很多相关问题,但是其中一些问题__sync*对我(ARM)而言是不可行的,而某些问题则针对asm/atomic.h

也许有一个针对GCC的内联汇编库(ICC支持gcc汇编)?

编辑:

对于添加操作,有一个非常局部的解决方案(允许实现原子计数器,但不能锁定需要CAS的自由结构):

如果使用libstc++(英特尔编译器使用libstdc++),则可以使用或__gnu_cxx::__exchange_and_add中定义的值。取决于编译器版本。<ext/atomicity.h>``<bits/atomicity.h>

但是,我仍然希望看到一些支持CAS的东西。


问题答案:

项目正在使用此:

http://packages.debian.org/source/sid/libatomic-
ops

如果您想要简单的操作(例如CAS),您是否不能仅使用内核之外的特定于arch的实现,并使用autotools /
cmake在用户空间中进行arch检查?就许可而言,尽管内核是GPL,但我认为这些操作的内联程序集由Intel /
AMD提供是有争议的,而不是内核具有许可证。它们恰好是内核源代码中易于访问的形式。



 类似资料:
  • 问题内容: 为了运行MIPS汇编程序,x86 linux周围是否有任何命令行解释器或任何其他程序集? 我希望能够编写简单的MIPS汇编程序并从本地计算机上的控制台运行它们。 我知道SPIM,但是它 需要X Windows ,我很好奇是否有更好的选择。 编辑:事实证明它不需要X Windows。我仍然对SPIM有问题。我的拙见不是最好的。Qemu / Cross编译的工具链需要更多工作,但我的怪癖却

  • 本文向大家介绍在Windows 10上原生运行Linux,包括了在Windows 10上原生运行Linux的使用技巧和注意事项,需要的朋友参考一下 微软已经推出了适用于Linux的WSL子系统,它使用户可以直接从Windows 10运行自己喜欢的Linux发行版,而无需双启动或使用虚拟机。 适用于Linux的Windows子系统的局限性 尽管这是朝Microsoft正确方向迈出的一步,但就完整功能

  • 问题内容: 我开始在Linux上进行pthread编程,而在最初的程序中,我完全感到困惑。下面是我正在运行的程序 我想知道的第一件事是线程执行的顺序不是顺序的? 第二件事是我故意放置print(“ amit”); 看到main确实在线程1终止期间停止了,但是在输出中我们看到的是首先执行了printf语句。整个过程的输出是 线程1 线程2 amitThread 1返回:0 线程2返回:0 问题答案:

  • 英特尔64和IA-32处理器提供锁定信号,在某些关键内存操作期间自动断言该信号,以锁定系统总线或等效链路。当该输出信号被断言时,来自其他处理器或总线代理的总线控制请求被阻止。软件可以指定在锁语义后面加上指令的锁前缀的其他情况。 它来自《英特尔手册》第3卷 听起来,内存上的原子操作将直接在内存(RAM)上执行。我很困惑,因为我在分析汇编输出时看到“没有什么特别的”。基本上,为

  • 主机系统为ARCHLinux。我想开发需要运行Windows docker容器的.NET4.6.1应用程序。所以我在VirtualBox下运行Win10。然后我在Win10中安装Docker,以运行Windows Docker容器。Linux->VirtualBox->Win10->Docker->Windows Docker容器->要运行的应用程序。 或者更具体地说,VirtualBox是否支持

  • 我有一个server.java文件: 还有一个客户。java文件格式为: 我还创建了自己的证书,如下所示: 但无论我做什么,我总是会犯错误: 我担心的是,如果我将端口从80更改为其他类型,代码工作得非常好,但我必须专门处理这个端口本身。证书和两个java文件位于同一文件夹中。你们能帮我找到一种在端口80上执行SSL操作的方法吗?