Foros del Web » Programación para mayores de 30 ;) » .NET »

[SOLUCIONADO] Variable synchronized en C# o en c++/cli

Estas en el tema de Variable synchronized en C# o en c++/cli en el foro de .NET en Foros del Web. Hola a todos. Tengo una clase con 3 variables que van a ser escritas por un hilo, por tanto no deberían poder ser leídas mientras ...
  #1 (permalink)  
Antiguo 31/07/2014, 03:25
 
Fecha de Ingreso: febrero-2014
Mensajes: 55
Antigüedad: 10 años, 1 mes
Puntos: 3
Variable synchronized en C# o en c++/cli

Hola a todos.

Tengo una clase con 3 variables que van a ser escritas por un hilo, por tanto no deberían poder ser leídas mientras algún hilo está utilizándolas.

Mi pregunta es, ¿hay algo en C# (o c++/cli) parecido al 'synchronized' de java?

Saludos y gracias.
  #2 (permalink)  
Antiguo 31/07/2014, 04:13
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 2 meses
Puntos: 606
Respuesta: Variable synchronized en C# o en c++/cli

No, en C# no existe el keyword synchronized. Tendrías que usar lock para restringir el acceso a las variables o partes del código que necesites proteger.
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 05/08/2014, 10:39
 
Fecha de Ingreso: febrero-2014
Mensajes: 55
Antigüedad: 10 años, 1 mes
Puntos: 3
Respuesta: Variable synchronized en C# o en c++/cli

Hola de nuevo, he estado "investigando" y he encontrado una manera, un tanto farragosa, de conseguir variables al estilo de synchronized de Java. Lo he probado en C++/CLI, pero estoy casi seguro de que en C# se puede hacer igual, solo que de este último no tengo conocimientos.

Lo hago mediante propertys, simplemente declaro un objeto extra en mi clase (de tipo Object por ej., llamado 'lock'), y luego declaro la variable que quiero "synchronized" como si fuera property, y defino sus métodos get y set haciendo Monitor::Enter/Exit(lock); (obviamente usando una variable auxiliar para no caer en recursividad infinita). Se ve perfectamente con un ejemplo:

Código:
//fichero de cabecera (.h)

ref class prPrty
{
public:
	prPrty();

	Thread^ thMethod();
	void thAux();
	int getA();

private:

	property int a{
		int get(){
			Monitor::Enter(lock);
			Thread::Sleep(3000);
			return __a;
			Monitor::Exit(lock);
		}

		void set(int _a){
			Console::WriteLine("sin lock");
			Monitor::Enter(lock);
			Console::WriteLine("con lock");
			Thread::Sleep(3000);
			__a = _a;
			Monitor::Exit(lock);
		}
	}

	int __a;

	Object ^lock;
};

/*********************************/

//Fichero fuente (.cpp)

#include "prPrty.h"


prPrty::prPrty(){
	this->lock = gcnew Object();
}

Thread^ prPrty::thMethod(){
	Thread ^th = gcnew Thread(gcnew ThreadStart(this, &prPrty::thAux));
	th->Start();
	return th;
}

void prPrty::thAux(){
	this->a = 20;
}

int prPrty::getA(){
	int aux;
	Console::WriteLine("\tEsperando para el lock...");
	Monitor::Enter(lock);
	Console::WriteLine("\tlock obtenido");
	aux = a;
	Monitor::Exit(lock);
	return aux;
}

/*********************************/

//main (.cpp)

int main(){
	prPrty ^a = gcnew prPrty();
	Thread ^th=a->thMethod();
	Thread::Sleep(500);
	Console::WriteLine("\t\t"+a->getA());
	th->Join();
	Console::ReadLine();
	return 0;
}
Si esto que he probado no demuestra nada, o es incorrecto, por favor explicadlo si podéis.

Gracias, saludos.
  #4 (permalink)  
Antiguo 06/08/2014, 00:44
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 2 meses
Puntos: 606
Respuesta: Variable synchronized en C# o en c++/cli

Si que es correcto. De hecho, estas usando en ese ejemplo justo lo que ya te puse hace casi una semana.
__________________
Aviso: No se resuelven dudas por MP!

Etiquetas: clase, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:40.