Lock dans les propriétés, la bonne approche?
Dans mon multithreading application que je suis en utilisant des variables qui peuvent être modifiées par de nombreux exemples, dans le même temps. C'est bizarre mais il a bien fonctionné sans aucun problème..mais bien sûr, je dois faire thread-safe. Je suis juste de commencer avec des serrures et je voudrais donc appretiate vos conseils:
Lorsque le client se connecte, la classe Client est créé, où chaque Client a son propre "Une" variable.
Parfois, le Client appelle la méthode comme ça:
Client selectedClient SelectOtherClientClassByID(sentID);
selectedClient.A=5;
Pas de problèmes jusqu'à aujourd'hui, même lorsque 5 classes ont été faites à la même époque (pool de threads), mais je pensais que sur l'ajout de serrures pour les propriétés?
Comme:
A {
get { return mA; }
set {
//use lock here for settting A to some value
}
}
Serait-il OK?
OriginalL'auteur Petr | 2009-10-23
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'utiliser des verrous dans les DEUX get et set. Ce verrou doit être le même objet. Par exemple:
Ce n'est pas une bonne idée de se verrouiller sur ce, comme il est accessible à partir de l'extérieur de la type.
Il pourrait changer pendant que vous fixez. La serrure agit comme une barrière, empêchant toute autre action jusqu'à ce que le propriétaire du verrou libère le verrou.
Je suis d'accord. Le changement sur mon code. A été tout simplement démontrer.
Désolé, j'étais sur la réunion, _NT s'il vous plaît, comment avez votre code avant de faire le changement, je veux dire quel était le problème Brian mentionné? J'aime apprendre autant que je peux 🙂
OriginalL'auteur NT_
Verrouillage de l'accès aux propriétés à l'intérieur d'accesseurs peut conduire à de faux résultats. Pour l'exemple, regardez le code suivant:
(oui, j'ai copié à partir de la première réponse)
Il y a une condition de course ici! L'opération "c++" en réalité deux accède à Un, un pour obtenir la valeur et l'autre pour définir la valeur de mise à jour. Rien ne garantit que ces deux accès seront effectués sans changement de contexte entre eux. Classique scénario pour condition de course!
Alors, méfiez-vous! Ce n'est pas une bonne idée de mettre des verrous à l'intérieur des accesseurs, les serrures doivent être explicitement obtenues, comme la réponse précédente suggère (si elle n'a pas à être avec SyncRoots, tout objet qui n')
Pour cela, vous développez votre serrure afin de couvrir l'ensemble de la région critique. Vous ne faites pas Un++.
NT: je ne vous comprends bien probablement. J'ai autour de 15 méthodes différentes opérations avec cette variable sur l'instance différente. Je ne suis pas sûr de savoir comment vous signifie augmenter la serrure. Ainsi, les propriétés de verrouillage n'est pas bon si j'ai lu correctement tous les ci-dessus
J'ai réalisé mon commentaire précédent pour qu'. Comme pour votre commentaire, vous devez déterminer si ceux-ci ont en commun une synchonisation objet. Dans ce cas, vous devez utiliser une seule serrure. Si vous êtes nouveau à tout cela, jetez un oeil à ce lien intéressant: codeproject.com/KB/threads/...
OriginalL'auteur ilial
C'est très rare quand tout vous avez besoin est juste de définir une propriété unique. Le plus souvent
selectedClient.A = 5
sera une partie d'une grande opération logique, qui implique plusieurs affectations/évaluations/etc. Pendant toute cette opération vous préférez la préférezselectedClient
à être dans un état cohérent et de ne pas introduire des blocages/conditions de course. Par conséquent, il sera beaucoup mieux exposerSyncRoot
propriété dans votreClient
de classe et de verrouillage dans le code appelant:SyncRoot n'est pas recommandé: Voir blogs.msdn.com/brada/archive/2003/09/28/50391.aspx
Citant le post de blog: "rassurez-vous nous n'allons pas faire la même erreur que nous construisons les versions génériques de ces collections." Et nous voici, 6 ans plus tard, avec la Liste des<T>.SyncRoot sans décourager les notes dans la MSDN: msdn.microsoft.com/en-us/library/bb356596.aspx
MSDN est loin d'être la meilleure ressource pour corriger la programmation! SyncRoot, est un verrou et un désastre (selon CLR via C# par Jeffrey Richter amazon.co.royaume-uni/gp/lecteur/0735621632/ref=sib_dp_pt#reader-lien)
OriginalL'auteur Anton Gogolev