【发布时间】:2016-07-22 08:00:17
【问题描述】:
我已经编译并分析了汇编输出:
struct S{
public:
int a,b,c,d,e,f,g,h,i,j,k;
};
int main() {
S s;
std::atomic<S> as;
as.store(s);
return 0;
}
我想看看它实际上是如何实现atomic store 的。当涉及对齐的“小”操作数时,这很容易。但是,现在我们有一个更广泛的操作数,所以情况更加复杂。
在我的另一个问题中(Atomicity on x86)@Peter Cordes 说:
对于更广泛的操作数,例如以原子方式将新数据写入多个 一个结构的条目,你需要用一个锁来保护它 访问它的尊重。 (您也许可以使用 x86 lock cmpxchg16b 使用重试循环来执行原子 16b 存储。注意没有办法 在没有锁的情况下模拟它。)
好的,但这究竟是什么意思?锁定是什么意思?
特别是,我知道lock 是一个前缀,可以确保“前缀”指令的原子性。特别是,@Peter Cordes 说:
您也许可以使用 x86 锁 cmpxchg16b 使用重试循环进行原子 16b 存储
我无法理解如何保持它的原子性?好的,我可以想象16B的内存可以以原子方式存储吗?但是下一次迭代呢?
我希望我的疑问可以理解,因为我表达起来有问题。
我正在调试上面的程序,在我看来,atomic_store 背后的魔力。
我想这个函数执行@Peter Cordes 所说的。如果有人要,我可以在这里贴上拆机__atomic_store
【问题讨论】:
-
你说你分析了生成的机器码。那么,你可以告诉我们这是如何实现的!
-
是的,继续粘贴 __atomic_store 的反汇编。 gcc 只是使用通过引用传递的要存储的数据生成对它的调用。
-
我错过了这里的问题吗??
-
@DavidHoelzer:不,你没有遗漏任何东西,这里没有真正的问题。我的“答案”一开始是评论,但后来我意识到它确实回答了一些问题,所以我继续做一个答案。整个事情可能应该是对我对上一个问题的回答的评论/回复。
标签: c++ multithreading assembly x86