SyncLock

23/06/2004 - 09:28 por diego | Informe spam
Quisiera saber como seria la sentencia SyncLock(no
permite que otro thread se ejecute en contemporaneo).
Gracias anticipadas...

Preguntas similare

Leer las respuestas

#6 e-lores
23/06/2004 - 15:20 | Informe spam
Lo que puede ser que ocurra es que cuando salta un tick del timer, se
ejecuten los métodos 1 , 2, 3 ,4 (secuencialmente) y mientras se está
ejecutando alguno de ellos se capture otro tick. No se si el evento se
mantiene en una cola hasta que se ha procesado completamente el primero o
por el contrario se ejecuta en paralelo.
Quizás venga por aquí el problema.

Ernesto Lores


"Octavio Hernandez" escribió en el mensaje
news:%
Diego,

En el código que muestras no hay ningún " paralelismo" - metodo2()


comenzará
a ejecutarse cuando termine metodo1(), y así sucesivamente...
Deberás crear cuatro hilos de ejecución, asignándole a cada uno de ellos


uno
de los métodos, para que su ejecución se simultanee. Y entonces sería


cuando
deberías utilizar lock() dentro de los métodos para garantizar la


disciplina
de acceso a los recursos que los cuatro hilos compartan.

Lanzarlos en hilos paralelos podría ser así:

// ...
new Thread(new Delegate(objeto.metodo1)).Start();
new Thread(new Delegate(objeto.metodo2)).Start();
new Thread(new Delegate(objeto.metodo3)).Start();
new Thread(new Delegate(objeto.metodo4)).Start();
// ...

Ahora supón que dentro de 'objeto' hay un campo 'x' en el que algunos
métodos leen y otros escriben, y no se debe permitir que haya dos hilos
simultáneos tocando ese campo. Dentro de los métodos, al acceder a 'x',
deberás utilizar lock:

lock (x)
{
// trabajar con el objeto x
}

Salu2 - Octavio

"Diego" escribió en el mensaje
news:2047b01c45918$2638cb80$
>¿Que quieres decir con cuatro procesos sincronos?
En realidad son normales metodos de una clase, al menos yo
no las declaro como hilos, las ejecuto normalmente:

private void timer_Tick(object sender, System.EventArgs e)
{
timer.Stop();
timer.Enabled=false;

object.metodo1();
object.metodo2();
object.metodo3();
object.metodo4();

timer.Enabled=true;
timer.Start();
}






>¿Que quieres decir con cuatro procesos sincronos?
>¿Estamos hablando de procesos (Process) o de hilos
(Thread) ?
>Lo único que te puedo decir es que es normal que
los 'procesos' (o hilos,
>aun no estoy seguro) continuen aunque pares el timer.
>Si me especificas un poco más intentaré ayudarte.
>Ernesto Lores
>
>
>"Diego" escribió en
el mensaje
>news:2035c01c45903$74bace30$
>Ernesto, gracias por tu respuesta.
>Te comento, que uso un objeto timer, que cada 15 segundos
>ejecuta 4 procesos sincronos.
>
>Mi problema es que cuando parte el timer es como si
>hubiese otro thread que se ejecuta casi en paralelo, esto
>lo pude comprobar ya que uno de los procesos me salva
>datos en un db, y encontre datos duplicados. Mas aun
>cuando paro el timer(entiendase
>timer.stop;timer.enabled=false), los procesos continuan
>ejecutandose.
>La verdad estoy un poco confundido.
>
>Tenes alguna idea del motivo de este comportamiento?
>
>saludos,
>Diego
>
>>En c# se utiliza
>>
>>lock(TuObjeto)
>>{
>>
>>}
>>
>>Sin embargo esto lo único que hace es bloquear la zona de
>memoria de tu
>>objeto para que ningún otro thread pueda acceder a ella
>(lo que no quiere
>>decir que paren su ejecución)
>>
>>Saludos.
>>Ernesto Lores.
>>
>>
>>"diego" escribió en
>el mensaje
>>news:1ff8c01c458f3$be3925d0$
>>> Quisiera saber como seria la sentencia SyncLock(no
>>> permite que otro thread se ejecute en contemporaneo).
>>> Gracias anticipadas...
>>
>>
>>.
>>
>
>
>.
>


Respuesta Responder a este mensaje
#7 Anonimo
23/06/2004 - 15:58 | Informe spam
Puse:
Public void Metodo1()
lock(this)
{
//Codigo
}
por cada metodo, y hasta ahora esta funzionando perfecto.
Creo que el problema es como decias Ernesto, por algun
motivo quedan en una cola de procesos,me ha pasado que
pare el timer y los procesos siguen ejecutandose.
No logro entender el porque todavia, pero con el lock
parece solucionado el problema.

Saludos a ambos y gracias por las respuestas...
Diego.
Lo que puede ser que ocurra es que cuando salta un tick


del timer, se
ejecuten los métodos 1 , 2, 3 ,4 (secuencialmente) y


mientras se está
ejecutando alguno de ellos se capture otro tick. No se si


el evento se
mantiene en una cola hasta que se ha procesado


completamente el primero o
por el contrario se ejecuta en paralelo.
Quizás venga por aquí el problema.

Ernesto Lores


"Octavio Hernandez" escribió en el


mensaje
news:%
Diego,

En el código que muestras no hay ningún " paralelismo" -




metodo2()
comenzará
a ejecutarse cuando termine metodo1(), y así




sucesivamente...
Deberás crear cuatro hilos de ejecución, asignándole a




cada uno de ellos
uno
de los métodos, para que su ejecución se simultanee. Y




entonces sería
cuando
deberías utilizar lock() dentro de los métodos para




garantizar la
disciplina
de acceso a los recursos que los cuatro hilos compartan.

Lanzarlos en hilos paralelos podría ser así:

// ...
new Thread(new Delegate(objeto.metodo1)).Start();
new Thread(new Delegate(objeto.metodo2)).Start();
new Thread(new Delegate(objeto.metodo3)).Start();
new Thread(new Delegate(objeto.metodo4)).Start();
// ...

Ahora supón que dentro de 'objeto' hay un campo 'x' en




el que algunos
métodos leen y otros escriben, y no se debe permitir




que haya dos hilos
simultáneos tocando ese campo. Dentro de los métodos,




al acceder a 'x',
deberás utilizar lock:

lock (x)
{
// trabajar con el objeto x
}

Salu2 - Octavio

"Diego" escribió




en el mensaje
news:2047b01c45918$2638cb80$
>¿Que quieres decir con cuatro procesos sincronos?
En realidad son normales metodos de una clase, al menos




yo
no las declaro como hilos, las ejecuto normalmente:

private void timer_Tick(object sender, System.EventArgs




e)
{
timer.Stop();
timer.Enabled=false;

object.metodo1();
object.metodo2();
object.metodo3();
object.metodo4();

timer.Enabled=true;
timer.Start();
}






>¿Que quieres decir con cuatro procesos sincronos?
>¿Estamos hablando de procesos (Process) o de hilos
(Thread) ?
>Lo único que te puedo decir es que es normal que
los 'procesos' (o hilos,
>aun no estoy seguro) continuen aunque pares el timer.
>Si me especificas un poco más intentaré ayudarte.
>Ernesto Lores
>
>
>"Diego" escribió




en
el mensaje
>news:2035c01c45903$74bace30$
>Ernesto, gracias por tu respuesta.
>Te comento, que uso un objeto timer, que cada 15




segundos
>ejecuta 4 procesos sincronos.
>
>Mi problema es que cuando parte el timer es como si
>hubiese otro thread que se ejecuta casi en paralelo,




esto
>lo pude comprobar ya que uno de los procesos me salva
>datos en un db, y encontre datos duplicados. Mas aun
>cuando paro el timer(entiendase
>timer.stop;timer.enabled=false), los procesos continuan
>ejecutandose.
>La verdad estoy un poco confundido.
>
>Tenes alguna idea del motivo de este comportamiento?
>
>saludos,
>Diego
>
>>En c# se utiliza
>>
>>lock(TuObjeto)
>>{
>>
>>}
>>
>>Sin embargo esto lo único que hace es bloquear la




zona de
>memoria de tu
>>objeto para que ningún otro thread pueda acceder a




ella
>(lo que no quiere
>>decir que paren su ejecución)
>>
>>Saludos.
>>Ernesto Lores.
>>
>>
>>"diego"




escribió en
>el mensaje
>>news:1ff8c01c458f3$be3925d0$
>>> Quisiera saber como seria la sentencia SyncLock(no
>>> permite que otro thread se ejecute en




contemporaneo).
>>> Gracias anticipadas...
>>
>>
>>.
>>
>
>
>.
>






.

Respuesta Responder a este mensaje
#8 Octavio Hernandez
23/06/2004 - 23:13 | Informe spam
Ernesto,

Has mencionado un tema interesante en el que no había caído.
Yo supuse que Diego se estaba referiendo a la clase
System.Windows.Forms.Timer, que se ejecuta de manera síncrona con el resto
del código. O sea, que los eventos del temporizador se van poniendo en cola
con el resto de los mensajes para ser sacados CUANDO TERMINE el tratamiento
del evento anterior. Con este Timer nunca ocurriría lo que tú dices.
Pero hay otra clase, System.Timers.Timer, que ejecuta en un hilo
independiente y sí respeta el intervalo de tiempo que tiene programado
,pudiendo suceder este "paralelismo" que mencionas.
Este artículo sobre el tema está bastante bien:

http://msdn.microsoft.com/msdnmag/i...fault.aspx

Salu2 - Octavio


"e-lores" escribió en el mensaje
news:
Lo que puede ser que ocurra es que cuando salta un tick del timer, se
ejecuten los métodos 1 , 2, 3 ,4 (secuencialmente) y mientras se está
ejecutando alguno de ellos se capture otro tick. No se si el evento se
mantiene en una cola hasta que se ha procesado completamente el primero o
por el contrario se ejecuta en paralelo.
Quizás venga por aquí el problema.

Ernesto Lores


"Octavio Hernandez" escribió en el mensaje
news:%
> Diego,
>
> En el código que muestras no hay ningún " paralelismo" - metodo2()
comenzará
> a ejecutarse cuando termine metodo1(), y así sucesivamente...
> Deberás crear cuatro hilos de ejecución, asignándole a cada uno de ellos
uno
> de los métodos, para que su ejecución se simultanee. Y entonces sería
cuando
> deberías utilizar lock() dentro de los métodos para garantizar la
disciplina
> de acceso a los recursos que los cuatro hilos compartan.
>
> Lanzarlos en hilos paralelos podría ser así:
>
> // ...
> new Thread(new Delegate(objeto.metodo1)).Start();
> new Thread(new Delegate(objeto.metodo2)).Start();
> new Thread(new Delegate(objeto.metodo3)).Start();
> new Thread(new Delegate(objeto.metodo4)).Start();
> // ...
>
> Ahora supón que dentro de 'objeto' hay un campo 'x' en el que algunos
> métodos leen y otros escriben, y no se debe permitir que haya dos hilos
> simultáneos tocando ese campo. Dentro de los métodos, al acceder a 'x',
> deberás utilizar lock:
>
> lock (x)
> {
> // trabajar con el objeto x
> }
>
> Salu2 - Octavio
>
> "Diego" escribió en el mensaje
> news:2047b01c45918$2638cb80$
> >¿Que quieres decir con cuatro procesos sincronos?
> En realidad son normales metodos de una clase, al menos yo
> no las declaro como hilos, las ejecuto normalmente:
>
> private void timer_Tick(object sender, System.EventArgs e)
> {
> timer.Stop();
> timer.Enabled=false;
>
> object.metodo1();
> object.metodo2();
> object.metodo3();
> object.metodo4();
>
> timer.Enabled=true;
> timer.Start();
> }
>
>
>
>
>
>
> >¿Que quieres decir con cuatro procesos sincronos?
> >¿Estamos hablando de procesos (Process) o de hilos
> (Thread) ?
> >Lo único que te puedo decir es que es normal que
> los 'procesos' (o hilos,
> >aun no estoy seguro) continuen aunque pares el timer.
> >Si me especificas un poco más intentaré ayudarte.
> >Ernesto Lores
> >
> >
> >"Diego" escribió en
> el mensaje
> >news:2035c01c45903$74bace30$
> >Ernesto, gracias por tu respuesta.
> >Te comento, que uso un objeto timer, que cada 15 segundos
> >ejecuta 4 procesos sincronos.
> >
> >Mi problema es que cuando parte el timer es como si
> >hubiese otro thread que se ejecuta casi en paralelo, esto
> >lo pude comprobar ya que uno de los procesos me salva
> >datos en un db, y encontre datos duplicados. Mas aun
> >cuando paro el timer(entiendase
> >timer.stop;timer.enabled=false), los procesos continuan
> >ejecutandose.
> >La verdad estoy un poco confundido.
> >
> >Tenes alguna idea del motivo de este comportamiento?
> >
> >saludos,
> >Diego
> >
> >>En c# se utiliza
> >>
> >>lock(TuObjeto)
> >>{
> >>
> >>}
> >>
> >>Sin embargo esto lo único que hace es bloquear la zona de
> >memoria de tu
> >>objeto para que ningún otro thread pueda acceder a ella
> >(lo que no quiere
> >>decir que paren su ejecución)
> >>
> >>Saludos.
> >>Ernesto Lores.
> >>
> >>
> >>"diego" escribió en
> >el mensaje
> >>news:1ff8c01c458f3$be3925d0$
> >>> Quisiera saber como seria la sentencia SyncLock(no
> >>> permite que otro thread se ejecute en contemporaneo).
> >>> Gracias anticipadas...
> >>
> >>
> >>.
> >>
> >
> >
> >.
> >
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida