代码之家  ›  专栏  ›  技术社区  ›  Paul J. Lucas

BSD以外的OSs的原子加载/存储?

  •  3
  • Paul J. Lucas  · 技术社区  · 14 年前

    在BSD提供的原子操作中(如 (9) 手册页),有 atomic_load_acq_int() atomic_store_rel_int() . 在寻找其他操作系统的等价物时(例如,通过阅读 (3) Mac OS X手册页 原子核行动 (3C)Solaris的手册页,以及 Interlocked*() int .

    volatile 在C/C++中?

    如果没有,那么如何对 内景

    (原子读取可以通过返回原子加法0的结果来模拟,但是原子写入没有等效的方法。)

    1 回复  |  直到 14 年前
        1
  •  4
  •   Nikolai Fetissov    13 年前

    atomic memory access 具有 cache coherence . 前者是在软件中构建同步原语(自旋锁、信号量和互斥)所需的硬件支持,而后者是在同一总线上工作的多个芯片(多个CPU和外围设备)的硬件支持,并且具有主存的一致视图。

    不同的编译器/库提供了不同的实用程序。举个例子, GCC intrinsics for atomic memory access . 它们都可以归结为 compare-and-swap load-linked/store-conditional 基于指令块,具体取决于平台支持。把你的资料汇编成, -S 有关GCC,请参阅生成的汇编程序。

    您不必显式地为缓存一致性做任何事情—它都是在硬件中处理的—但它确实有助于理解它是如何工作的,以避免类似这样的事情 cache line ping-pong .

    尽管如此, aligned 单字读写 是原子的 在所有的商品平台上(如果我错了,有人纠正我)。自 int s的大小小于或等于处理器字,您将被覆盖(请参阅上面的GCC内置链接)。

    这是最重要的 秩序 重要的读写操作。这就是架构内存模型的重要性所在。它规定了哪些操作可以由硬件重新排序,哪些操作不能由硬件重新排序。例如,更新一个链表—在项目本身处于一致状态之前,您不希望其他CPU看到链接的新项目。明确的 memory barriers 获得 barrier确保后续操作不会在barrier之前重新排序(假设您在项目内容之前读取链表项目指针), 释放 barrier确保以前的操作不会在barrier之后重新排序(在写入新的链接指针之前写入项内容)。

    volatile "almost useless" 用于并发编程。

    编辑:

    即将到来的C++ 0x标准最终解决并发性问题,请参见 Hans Boehm's C++ memory model papers