究竟发生了两个线程同时增加原子整数的情况

时间:2018-07-19 14:49:29

标签: multithreading

请考虑以下情形:

线程1调用get并获取值1。 线程1的下一个计算为2。 线程2调用get并获取值1。 线程2的下一个计算为2。 两个线程都尝试写入值。 现在由于原子-只有一个线程会成功,另一个线程将从compareAndSet接收到false并再次执行。 我被“因为原子”困住了,如果两个线程同时通过compareandset方法。我在寻找比理论更实际的例子。

2 个答案:

答案 0 :(得分:0)

这是硬件,特别是缓存一致性协议(MESI等),可确保从不同CPU内核(运行相应的并发线程)并发执行的原子操作的一致性。我强烈建议您阅读一本名为《内存屏障:软件黑客的硬件视图》的好书。

答案 1 :(得分:0)

硬件互锁将确保如果两个或多个线程同时尝试进行compareAndSet,则将一个线程选为“获胜”,而所有其他线程将选为“输”。通常,这将通过对所有内核使用通用时钟来完成,以便每个内核将看到离散的执行步骤序列(在硬件级别称为“周期”),其中 各种各样的事情发生。在一个过于简化的执行模型中,内核没有高速缓存,而是使用多端口内存,每个内核可以在每个周期向其他每个内核报告是否正在执行compareAndSet的“读取”部分。在看到另一个线程启动一个线程后,每个内核将推迟在该周期中启动一个compareAndSet,如果编号较低的内核在同一周期中以相同的地址开始一个内核,则每个内核可以推迟并重新启动自己的compareAndSet。 / p>

最终结果是两个内核不可能“成功”同时在同一存储上执行compareAndSet操作。相反,硬件将延迟其中一项操作,以便它们顺序发生。