Semáforos o Monitores

10/08/2004 - 00:12 por Pedro Ayensa | Informe spam
Hola,
estoy buscando la forma de implementar Monitores que no sean mutex. En mi
proyecto quiero que sólo se puedan crear simultáneamente X instancias de una
clase, y el resto me gusaría que se quedaran a la espera de que alguna de
las creadas terminen su función. Había pensado que, como en UNIX, quizás
sería posible inicializar algún tipo de valor al número de instancias que
pueden crearse, y que cada vez que se creara una se decrementara hasta
llegar a 0, bloqueando a las sucesivas llamadas al constructor, pero sólo
encuentro el SyncLock.
¿Alguna idea que me pueda ayudar?
Gracias.
 

Leer las respuestas

#1 Drk
10/08/2004 - 09:39 | Informe spam
Te documento todas las formas de sincronización que tengo constancia que hay
en VB .NET a ver si te puede ayudar

SYNLOCK
-

Viene a ser como un Mutex pero subido al Framework en vez de trabajar a
nivel de Windows. Un ejemplo por ejemplo con el Synlock para ver en que
casos se puede utilizar. Primero aplicamos el ejemplo sin el atributo de
sincronización:

Imports System.Threading



Module Module1

Sub Main()

Prueba()

Console.ReadLine()

End Sub



Sub Prueba()

For i As Integer = 1 To 5

Dim h As New Thread(AddressOf Funcion)

h.Name = "Subproceso núm " & i.ToString

h.Start()

Next

End Sub



Sub Funcion()

For i As Integer = 1 To 100

Console.Write("Soy ")

Console.Write("un texto ")

Console.Write("de prueba ")

Console.Write("de sincronización ")

Console.Write("desde " & Chr(10) & " ")

Console.WriteLine(Thread.CurrentThread.Name)

Next

End Sub

End Module



Para hacerlo sincronizado y no se mezcle el texto al salir declararemos a
nivel de módulo:

Dim Var As String = "" 'Para que no sea Nothing



Y modificaremos la función Funcion():

Sub Funcion()

For i As Integer = 1 To 100

SyncLock (Var)

Console.Write("Soy ")

Console.Write("un texto ")

Console.Write("de prueba ")

Console.Write("de sincronización ")

Console.Write("desde " & Chr(10) & " ")

Console.WriteLine(Thread.CurrentThread.Name)

End SyncLock

Next

End Sub



MONITOR



Parecido al Synlock:

Monitor.Enter(obj)

'Código

Monitor.Exit(obj)

Monitor.Wait(400) 'Permite esperar



INTERLOCKED

-

Permite sobre una variable entera hacer incrementos, decrementos y
comparaciones utilizadas por varios hilos.
System.Threading.Interlocked.Increment(var) o .Decrement(var), esto
permitirá que sólo pueda entrar un solo hilo a la hora de hacerlo. Es como
una reducción del Synlock ya que actúa sobre una sola variable.





MUTEX



Permite establecer un token/testigo sobre una función, hasta que no esté
libre no podrá utilizar esa función otro hilo. Funciona a nivel de Windows
por lo que no está recomendado para trabajar en multiplataforma pero si es
el mejor a la hora de trabajar únicamente en Windows.



Dim m As New Mutex



Sub procedimiento()

m.WaitOne() ‘Para dar comienzo

'Código

m.ReleaseMutex() ‘Para finalizar

End Sub



READWRITERLOCK


Permite que lean muchos hilos a la vez pero a la hora de escribir únicamente
un hilo. Simulamos con un ejemplo, faltaría indicar procesos de lectura y
escritura:

Imports System.Threading



Module Module1

Sub main()

ProbarBloqueoLecturaEscritura()

Console.ReadLine()



End Sub



Dim rwl As New ReaderWriterLock

Dim rnd As New Random



Sub ProbarBloqueoLecturaEscritura()

Dim i As Integer

For i = 1 To 10

Dim t As New Thread(AddressOf HacerLaTarea12)

t.Name = i.ToString

t.Start()

Next

Thread.Sleep(20000)

End Sub



Sub HacerLaTarea12()

Dim i As Integer

Dim tNombre As String = Thread.CurrentThread.Name

'Ejecutar 10 operaciones de lectura y escritura. Las lecturas són
más frecuentes

For i = 1 To 10

If rnd.NextDouble < 0.8 Then

'Intentar realizar una operación de lectura

rwl.AcquireReaderLock(Timeout.Infinite) ‘Se espera si está
escribiendo

Console.WriteLine("El subproceso {0} está leyendo", tNombre)

Thread.Sleep(300)

Console.WriteLine("El subproceso {0} ha completado la
operación de lectura", _

tNombre)

rwl.ReleaseReaderLock()

Else

'Intentar realizar una operación de escritura

rwl.AcquireWriterLock(Timeout.Infinite) ‘Se espera si está
escribiendo

Console.WriteLine("El subproceso {0} está escribiendo",
tNombre)

Thread.Sleep(300)

Console.WriteLine("El subproceso {0} ha completado la
operación de escritura", _

tNombre)

rwl.ReleaseWriterLock()

End If

Next

End Sub

End Module


AUTORESETEVENT / MANUALRESETEVENT



Hay un Productor que realiza las acciones y un Consumidor que procesa los
resultados.


Un saludo,

Drk

"Pedro Ayensa" escribió en el mensaje
news:%
Hola,
estoy buscando la forma de implementar Monitores que no sean mutex. En mi
proyecto quiero que sólo se puedan crear simultáneamente X instancias de


una
clase, y el resto me gusaría que se quedaran a la espera de que alguna de
las creadas terminen su función. Había pensado que, como en UNIX, quizás
sería posible inicializar algún tipo de valor al número de instancias que
pueden crearse, y que cada vez que se creara una se decrementara hasta
llegar a 0, bloqueando a las sucesivas llamadas al constructor, pero sólo
encuentro el SyncLock.
¿Alguna idea que me pueda ayudar?
Gracias.


Preguntas similares