He estado haciendo multi-threading simple en VB.NET por un tiempo, y acabo de entrar en mi primer gran proyecto de múltiples subprocesos. Siempre he hecho todo usando la declaración Synclock
porque no creía que hubiera una mejor manera.¿Por qué usar SyncLocks en .NET para operaciones simples cuando la clase Interlocked está disponible?
acabo de aprender acerca de la clase Interlocked
- que hace que parezca como si todo esto:
Private SomeInt as Integer
Private SomeInt_LockObject as New Object
Public Sub IntrementSomeInt
Synclock SomeInt_LockObject
SomeInt += 1
End Synclock
End Sub
se puede reemplazar con una sola instrucción:
Interlocked.Increment(SomeInt)
Este se encarga de todo el bloqueo interno y modifica el número. Esto sería mucho más simple que escribir mis propios bloqueos para operaciones simples (las operaciones más largas o más complicadas obviamente aún necesitan su propio bloqueo).
¿Hay algún motivo por el que haya activado mi propio bloqueo, utilizando objetos de bloqueo dedicados, cuando puedo lograr lo mismo con los métodos Interlocked
?
¿Puede darnos un ejemplo de tal situación? Si solo estoy haciendo un incremento/decremento simple (o .Add si necesito cambiar el valor en más de 1), parece que Interlocked sería mejor en todos los casos. Si necesito algo más avanzado (como un proceso de 4 pasos donde necesito garantizar que es el único hilo que lo ejecuta en un momento dado), necesito un poco de sincronización. Me interesa una situación en la que Interlocked parezca apropiado, pero es una mala elección. – SqlRyan
Si está trabajando con dos variables diferentes, 'Interbloqueado' no es suficiente. – SLaks