Bloqueo subprocesos son un tipo valor

29/01/2004 - 16:03 por Mario Barro | Informe spam
Hola a todos;

Cómo es posible realizar un bloqueo exclusivo para realizar una operación
atómica sobre una tipo valor.

Ejemplo:

private static int _miContador;

public static void AddContador( int cantidad )
{
//Generar bloqueo multiproceso.
_miContador += cantidad;
// Liberar bloqueo
}

Los tipos de bloqueos que he visto (lock, monitor) indican que no se deben
utilizar para tipos-valor.

y la clase Interloock no tiene métodos para añadir sumar una cantidad
variable.

Espero se entienda lo expuesto.

Saludos
Mario Barro

Preguntas similare

Leer las respuestas

#1 Rodrigo Corral González [MVP]
29/01/2004 - 18:36 | Informe spam
public static void AddContador( int cantidad )
{
lock(this) _miContador += cantidad;
}

De todos modos incrementar un int de 32 bits en plataforma Intel de 32 bits
es una operación atomica, no necesita sincronización pero nunca se sabe
sobre que plataformas correrá el .net en el futuro.

Rodrigo Corral González

microsoft.public.es.vc FAQ
http://vcfaq.europe.webmatrixhosting.net
Respuesta Responder a este mensaje
#2 Rodrigo Corral González [MVP]
29/01/2004 - 18:40 | Informe spam
Si el incremento siempre es 1 es mucho mejor hacer:

public static void AddContador()
{
Interlock.Increment(_miContador)
}


Rodrigo Corral González

microsoft.public.es.vc FAQ
http://vcfaq.europe.webmatrixhosting.net
Respuesta Responder a este mensaje
#3 Mario Barro
29/01/2004 - 18:52 | Informe spam
Gracias por tu respuesta e interesante aclaración sobre la operación en
Intel



Respuesta Responder a este mensaje
#4 Pedro Luna Montalvo
03/02/2004 - 18:45 | Informe spam
Saludos Mario:

En realidad, el texto que leiste indicaba que no se pueden usar tipos por
valor como objetos de bloqueo.

Mira le siguiente ejemplo:

private static int _miContador;
private static object _miObjetoBloqueo = new object();

public static void AddContador( int cantidad )
{
lock (_miObjetoBloqueo) {
//Generar bloqueo multiproceso.
_miContador += cantidad;
// Liberar bloqueo
}
}


El valor que se usa con la sentencia lock debe ser de tipo referencia.
Lo unico que tienes que asegurarte es que todos los hilos de tu aplicacion
referencien a la misma instancia del objeto usado para la sincrinizacion
(por eso en mi caso use una instancia de un objeto en una propiedad
estatica).

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