为什么自增会丢更新
多线程对同一个计数器 +1 会丢更新,是因为【0】。 原子操作模型:atomic_add 一步到位不可分;final_count(n, incs, 是否原子)——原子 = n*incs、非原子最坏只剩 incs;lost=丢了几次更新。
怎么让自增不丢
要让并发自增不丢更新,办法是【0】。 原子操作模型:atomic_add 一步到位不可分;final_count(n, incs, 是否原子)——原子 = n*incs、非原子最坏只剩 incs;lost=丢了几次更新。
非原子最坏剩多少
按模型,3 个线程各 +10、非原子,final_count(3, 10, False) 最坏交回几? 原子操作模型:atomic_add 一步到位不可分;final_count(n, incs, 是否原子)——原子 = n*incs、非原
丢了几次更新
按模型,3 个线程各 +10、非原子,lost(3, 10, False) 交回几? 原子操作模型:atomic_add 一步到位不可分;final_count(n, incs, 是否原子)——原子 = n*incs、非原子最坏只剩 inc
补全:原子加
补全 atomic_add:把 d 加到 x 上、一步到位。 原子操作模型:atomic_add 一步到位不可分;final_count(n, incs, 是否原子)——原子 = n*incs、非原子最坏只剩 incs;lost=丢了几次更
补全:最终计数
补全 final_count:原子 = n*incs,非原子最坏只剩 incs。 原子操作模型:atomic_add 一步到位不可分;final_count(n, incs, 是否原子)——原子 = n*incs、非原子最坏只剩 incs;
补全:丢了多少
补全 lost:原子不丢;非原子丢 (n-1)*incs。 原子操作模型:atomic_add 一步到位不可分;final_count(n, incs, 是否原子)——原子 = n*incs、非原子最坏只剩 incs;lost=丢了几次更新
CAS 干的是什么事
比中了当前值,才换成新的 期望对不上就重来,对上了才换 CAS(比较并交换)一步做的是【0】。 CAS 模型:cas(当前, 期望, 新值)——当前==期望才换、交回 (是否成功, 换后值);cas_ok 会不会成、apply_cas 只交
CAS 失败了怎么办
比中了当前值,才换成新的 期望对不上就重来,对上了才换 CAS 发现当前值已经变了、这次没换成,通常【0】。 CAS 模型:cas(当前, 期望, 新值)——当前==期望才换、交回 (是否成功, 换后值);cas_ok 会不会成、apply
CAS 为什么算原子
CAS 之所以能当同步砖用,是因为它【0】。 CAS 模型:cas(当前, 期望, 新值)——当前==期望才换、交回 (是否成功, 换后值);cas_ok 会不会成、apply_cas 只交回换后值、spins(看到的值序列, 期望)=期望