Comment fonctionne vraiment le travail. (trajet IDENTITÉ FONCTION & valeurs)Comment fonctionne le transport?
la Documentation Clojure dit:
Utilisation: (trajet ref plaisir & args)
doit être appelé dans une transaction. (Définit la valeur transactionnelle de ref à:
(applique des arguments amusants dans la transaction-value-of-ref) et retourne la valeur de transaction de ref.
Au point d'engagement de la transaction, définit la valeur de ref être:
(appliquer le plaisir le plus récemment commis-valeur de-ref args)
Ainsi, le formulaire de trajet est effectuée en deux phases.
est la deuxième phase atomique (appliquer le plaisir le plus récemment commis-valeur de-ref args)
sinon, ce qui se passe dans cet exemple: 2 fils (T1 et T2).
Les deux vont incrémenter (fonction commutative) la même identité.
IDENTITY: (def i (ref 0)
(dosync (commute inc i))
T1 dans la première étape de l'inc d'appel de trajet avec ref i = 0 (en valeur transactionnelle = 1)
T1 arrêt
T2 dans la première étape de l'appel de trajet inc avec ref i = 0 (en valeur transactionnelle = 1)
T2 arrêt
T1 dans la deuxième étape appel inc nouveau avec la dernière valeur engager i = 0, le retour de la fonction inc, mais avant u pdate l'arbitre (i) T1 arrêt
T2 dans le deuxième appel de l'étape inc nouveau avec la dernière valeur engager i = 0 et mettre à jour la référence
T1 recommencer et mettre à jour la référence à la inc valeur renvoyée = 1
Ceci est un problème de condition de concurrence? comment clojure éviter cela? si la deuxième phase est atomique, cela n'arrivera pas.
Merci à l'avance
MISE À JOUR: si je comprends bien la dernière phase des opérations de déplacement (point d'engagement) est synchronisé « fun UNLOCK ** LOCK trajet »?
Nice Michaelle. Donc, si je comprends bien, la dernière phase des opérations de navette (point de validation) est synchronisée "LOCK commute fun UNLOK"? – CHAPa