Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows BSD以外的OSs的原子加载/存储?_Windows_Macos_Solaris_Atomic_Freebsd - Fatal编程技术网

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

Windows BSD以外的OSs的原子加载/存储?,windows,macos,solaris,atomic,freebsd,Windows,Macos,Solaris,Atomic,Freebsd,在BSD提供的原子操作中(如atomic(9)手册页所示),有原子加载\u acq\u int()和原子存储\u rel\u int()。在寻找其他操作系统的等价物时(例如,通过阅读Mac OS X的atomic(3)手册页,Solaris的atomic_ops(3C)手册页,以及Windows的Interlocked*()函数),似乎没有任何(明显的)等同于仅以原子方式读取/写入int 这是不是因为这意味着那些为int读写的操作系统默认保证是原子的?(或者必须在C/C++中使用声明它们vola

在BSD提供的原子操作中(如atomic(9)手册页所示),有
原子加载\u acq\u int()
原子存储\u rel\u int()
。在寻找其他操作系统的等价物时(例如,通过阅读Mac OS X的atomic(3)手册页,Solaris的atomic_ops(3C)手册页,以及Windows的
Interlocked*()
函数),似乎没有任何(明显的)等同于仅以原子方式读取/写入
int

这是不是因为这意味着那些为
int
读写的操作系统默认保证是原子的?(或者必须在C/C++中使用声明它们
volatile

如果没有,那么如何在这些操作系统上进行
int
的原子读写呢


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

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

不同的编译器/库为第一个编译器提供不同的实用程序。举个例子,这里是。它们都归结为根据平台支持生成基于或的指令块。使用GCC的
-S
编译源代码,并查看生成的汇编程序

你不必为缓存一致性做任何明确的事情——这都是在硬件中处理的——但了解它是如何工作的肯定会有助于避免类似这样的事情


尽管如此,单个单词的读写在所有的商品平台上都是原子的(如果我在这里错了,有人会纠正我)。由于
int
s的大小小于或等于处理器字,因此我们将介绍您(请参阅上面的GCC内置链接)

重要的是读写的顺序。这就是架构内存模型的重要性所在。它规定了硬件可以和不能重新排序的操作。例如,更新链接列表-在项目本身处于一致状态之前,您不希望其他CPU看到链接的新项目。可能需要显式(通常也称为“内存围栏”)。获取障碍确保后续操作不会在障碍之前重新排序(例如,在项目内容之前读取链表项目指针),释放障碍确保之前的操作不会在障碍之后重新排序(在写入新链接指针之前写入项目内容)

volatile
经常被误解为与上述所有内容相关。事实上,它只是一条指令,要求编译器不要在寄存器中缓存变量值,而是在每次访问时从内存中读取变量值。许多人认为它是用于并发编程的

对冗长的答复表示歉意。希望这能澄清一点

编辑:
即将推出的C++0x标准最终解决了并发问题,有关详细信息,请参阅。

您确定需要这些操作吗?它们不完全是便携式的;相反,有些操作系统为您提供了构建关键部分的其他工具。为什么不提供一个你打算如何使用它们的例子(你可以挖空关键部分的内脏;这只会分散你的注意力…@Fellows:不,不确定。我知道它们不便于携带(我甚至提到它们仅限于BSD)。我的用例是一个简单的引用计数,即原子int(不,对于这个项目,我不能使用boost。即使我可以,从源代码看,它似乎不支持很多操作系统。)因此,如果单字读/写是原子的,为什么BSD提供原子加载(acq)int()和原子存储(rel)int()?这些提供了作为加载/存储的一部分的内存屏障。“单字读写在所有商品平台上都是原子的(如果我错了,有人纠正我)”——我认为只有当它们对齐时才是真的。通常,编译器会确保变量是对齐的,所以这不是问题。