一般地,对于int num,num++(或++num),作为读-修改-写操作中,是不是原子.但我经常看到编译器,例如GCC,为它生成以下代码(在这里尝试):
由于第5行对应于num++一条指令,我们可以得出结论,在这种情况下num++ 是原子的吗?
如果是这样,是否意味着如此生成num++可以在并发(多线程)场景中使用而没有任何数据争用的危险(例如,我们不需要制作它,std::atomic<int>并强加相关成本,因为它是无论如何原子)?
UPDATE
请注意,这个问题不是增量是否是原子的(它不是,而且是问题的开头行).它是否可以在特定场景中,即在某些情况下是否可以利用单指令性质来避免lock前缀的开销.而且,作为公认的答案约单处理器的机器,还有部分提到这个答案,在其评论和其他人谈话解释,它可以(尽管不是C或C++).
我想知道多核处理器的哪个核心在cpu启动时首先初始化?(我的意思是在引导程序级别)是第一个核心?还是随机核心?
我使用 C++ 很长时间了,现在我开始学习汇编并学习处理器的工作原理(不仅仅是为了好玩,而且我必须作为测试程序的一部分)。在学习汇编时,我开始听到一些我在讨论多线程时在这里和那里听到的一些术语,因为我在科学计算中做过很多多线程。我正在努力获得完整的图片,我很感激帮助我扩大我的图片。
我了解到,最简单的总线就像一个多路复用器,然后是一个多路分解器。每端都以一个地址作为输入,以便将两端与一些外部组件连接起来。两端可以根据地址指向内存、显卡、RAM、CPU寄存器或其他任何东西。
现在开始我的问题:我一直听到人们争论是使用互斥锁还是原子来确保线程安全(我知道没有最终答案,这不是我的问题,但我的问题是关于比较)。例如,这里声称原子是如此糟糕,以至于它们会因为总线锁定而阻止处理器做体面的工作。
有人可以详细解释一下总线锁定是什么,以及为什么它不像互斥锁,而 AFAIK,互斥锁需要至少两个原子操作来锁定和解锁。