J'examine du code écrit par un consultant, et bien que des dizaines de signaux d'alarme soient déjà apparus, je ne peux pas comprendre l'extrait de code suivant:
private void foo()
{
if (InvokeRequired)
{
lock (new object())
{
if (m_bar!= null)
Invoke(new fooDelegate(foo), new object[] { });
}
}
else
{
if(OnBazChanged != null)
OnBazChanged();
}
}
Que fait lock (new object ()) ici? Ne devrait avoir aucun effet car il se verrouille toujours sur un autre objet, mais ce type de verrouillage est persistant dans tout le code, même dans les parties non copiées-collées. Est-ce un cas particulier dans le langage C # qui est compilé vers quelque chose que je ne connais pas, ou le programmeur a-t-il simplement adopté un culte du cargo qui fonctionnait il y a quelque temps?
c#
thread-safety
locking
Charles
la source
la source
new object()
était stocké dans un champ, et ce champ était utilisé dans leslock()
déclarations, et ils ne savaient pas qu'il valait mieux ne pas le mettre en ligne.lock
code est totalement inutileRéponses:
Je ne serais pas surpris si c'était quelqu'un qui avait vu ceci:
et a pensé qu'il pourrait réduire le nombre de lignes.
Je serais très inquiet si c'était le cas cependant ...
la source
Voici une question similaire et une réponse:
la source
C'est probablement inutile. Mais il y a une chance qu'il soit là pour créer une barrière mémoire. Je ne sais pas si c # verrouille l'élision ou s'il le fait s'il préserve la sémantique de classement du verrou.
la source