redis - Comment comprendre le fonctionnement atomique de Memcache?
大家讲道理2017-05-31 10:36:15
0
1
1047
L'ajout de Memcache est atomique, c'est-à-dire que plusieurs processus effectuent des opérations d'ajout en même temps, et aucune condition de concurrence ne se produira. Cela signifie-t-il que l'ajout ne générera pas de concurrence ? ?
L'interlocuteur réfléchit trop. C'est précisément grâce à l'atomicité de add que nous pouvons être assurés de la concurrence. add 的原子性,我们才能够放心的并发。
你对底层概念了解的不够。
我们说一个操作的并发是没有意义的。
a = b + c;
上面的语句是原子性的吗?上面的语句可以并发吗?
a = getValueOfB() + getValueOfC();
上面的呢?
a = add(getValueOfB(), getValueOfC());
这个呢?
+ 是原子性的,那么 + 就不能并发了吗?不是。
我们设想一个任何操作都不是原子性的世界。
拿一个最简单的 i++ 举例吧:
i 的值是 4。
此时 2 个线程同时执行 i++。(姑且认为同时就是你说的并发吧)
i++ 是怎么执行的呢?
首先要获取 i 的值。
把 i 的值加 1
最终结果存入 i
此时如果 i++ 不是原子性的,那么 2 个线程就会出现 各种执行顺序,从而得到错误的结果。
第一个线程取得了 i 的值是 4
第二个线程取得了 i 的值是 4
第一个线程把 i 加 1,得到 5
第二个线程把 i 加 1,得到 5
第一个线程把 5 存入 i
第二个线程把 5 存入 i
得到最终结果,i 是 5。显然这个结果是错误的。
但是我们却没有遇到过这种情况,因为 i++ 是原子性的。
那么原子性的是不是就无法并发了?是的。
who care
从使用者角度讲,addVous n’en savez pas assez sur les concepts sous-jacents. On dit que la
simultanéité d'une opération #🎜🎜# n'a aucun sens. #🎜🎜#
rrreee
#🎜🎜#La déclaration ci-dessus est-elle atomique ? Les instructions ci-dessus peuvent-elles être exécutées simultanément ? #🎜🎜#
rrreee
#🎜🎜#Et celui ci-dessus ? #🎜🎜#
rrreee
#🎜🎜#Et ça ? #🎜🎜#
#🎜🎜#+ est atomique, donc + ne peut-il pas être concurrent ? Non. #🎜🎜#
#🎜🎜#Nous envisageons un monde où #🎜🎜# aucune opération n'est atomique #🎜🎜#. #🎜🎜#
#🎜🎜# Prenons comme exemple le i++ le plus simple : #🎜🎜#
#🎜🎜#La valeur de i est 4. #🎜🎜#
#🎜🎜#En ce moment, 2 threads #🎜🎜# sont #🎜🎜# exécutant i++ en même temps. (Supposons que la simultanéité soit ce que vous appelez la concurrence) #🎜🎜#
#🎜🎜#Comment fonctionne i++ ? #🎜🎜#
#🎜🎜#Obtenez d’abord la valeur de i. #🎜🎜#
#🎜🎜#Ajoutez 1 à la valeur de i#🎜🎜#
#🎜🎜#Le résultat final est stocké dans i#🎜🎜#
#🎜🎜#Si i++ n'est pas atomique à ce stade, alors les deux threads auront des ordres d'exécution différents, ce qui entraînera des résultats erronés. #🎜🎜#
#🎜🎜#Le premier fil de discussion a obtenu la valeur de i qui est 4#🎜🎜#
#🎜🎜#Le deuxième fil de discussion a obtenu la valeur de i qui est 4#🎜🎜#
#🎜🎜#Le premier fil ajoute 1 à i et obtient 5#🎜🎜#
#🎜🎜#Le deuxième fil ajoute 1 à i pour obtenir 5#🎜🎜#
#🎜🎜#Le premier fil stocke 5 dans i#🎜🎜#
#🎜🎜#Le deuxième fil stocke 5 dans i#🎜🎜#
#🎜🎜#Obtenez le résultat final, j'ai 5. Ce résultat est évidemment faux. #🎜🎜#
#🎜🎜#Mais nous n'avons pas rencontré cette situation car i++ est atomique. #🎜🎜#
#🎜🎜#Alors ça veut dire que l'atomicité ne peut pas être concurrente ? Oui. #🎜🎜#
#🎜🎜#on s'en fiche#🎜🎜#
#🎜🎜#Du point de vue de l'utilisateur, l'opération add doit être atomique. Ce que nous faisons simultanément, c'est le #🎜🎜#système#🎜🎜#, et non l'#🎜🎜#opération#🎜🎜#. #🎜🎜#
L'interlocuteur réfléchit trop. C'est précisément grâce à l'atomicité de
add
que nous pouvons être assurés de la concurrence.add
的原子性,我们才能够放心的并发。你对底层概念了解的不够。
我们说一个操作的并发是没有意义的。
上面的语句是原子性的吗?上面的语句可以并发吗?
上面的呢?
这个呢?
+
是原子性的,那么+
就不能并发了吗?不是。我们设想一个任何操作都不是原子性的世界。
拿一个最简单的
i++
举例吧:i
的值是4
。此时 2 个线程同时执行
i++
。(姑且认为同时就是你说的并发吧)i++
是怎么执行的呢?首先要获取 i 的值。
把 i 的值加 1
最终结果存入 i
此时如果 i++ 不是原子性的,那么 2 个线程就会出现 各种执行顺序,从而得到错误的结果。
第一个线程取得了 i 的值是 4
第二个线程取得了 i 的值是 4
第一个线程把 i 加 1,得到 5
第二个线程把 i 加 1,得到 5
第一个线程把 5 存入 i
第二个线程把 5 存入 i
得到最终结果,i 是 5。显然这个结果是错误的。
但是我们却没有遇到过这种情况,因为 i++ 是原子性的。
那么原子性的是不是就无法并发了?是的。
who care
从使用者角度讲,
simultanéité d'une opération #🎜🎜# n'a aucun sens. #🎜🎜# rrreee #🎜🎜#La déclaration ci-dessus est-elle atomique ? Les instructions ci-dessus peuvent-elles être exécutées simultanément ? #🎜🎜# rrreee #🎜🎜#Et celui ci-dessus ? #🎜🎜# rrreee #🎜🎜#Et ça ? #🎜🎜# #🎜🎜#add
Vous n’en savez pas assez sur les concepts sous-jacents. On dit que la+
est atomique, donc+
ne peut-il pas être concurrent ? Non. #🎜🎜# #🎜🎜#Nous envisageons un monde où #🎜🎜# aucune opération n'est atomique #🎜🎜#. #🎜🎜# #🎜🎜# Prenons comme exemple lei++
le plus simple : #🎜🎜# #🎜🎜#La valeur dei
est4
. #🎜🎜# #🎜🎜#En ce moment, 2 threads #🎜🎜# sont #🎜🎜# exécutanti++
en même temps. (Supposons que la simultanéité soit ce que vous appelez la concurrence) #🎜🎜# #🎜🎜#Comment fonctionnei++
? #🎜🎜#add
doit être atomique. Ce que nous faisons simultanément, c'est le #🎜🎜#système#🎜🎜#, et non l'#🎜🎜#opération#🎜🎜#. #🎜🎜#