/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

MEMORIA COMPARTIDA

 
      Índice del Foro elrincondelc.com -> Java
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Jawir



Registrado: 16 Feb 2006
Mensajes: 50

MensajePublicado: 08/11/2008 5:09 am
Título: MEMORIA COMPARTIDA

Hola me gustaria saber si como en C existe lo de memoria compartida shmget, shmat, shmdt. Hay algo similar en Java para poder compartir una zona de memoria entre varios threads

Gracias
Volver arriba
marioxcc



Registrado: 17 Oct 2008
Mensajes: 171
Ubicación: México

MensajePublicado: 08/11/2008 4:13 pm
Título: Imposible :(

Yo programo en Java desde los 9 años, pero este lenguaje me desepcionó porque no permite el manejo de memoria a bajo nivel, es por eso que decidí aprender C. Si quieres manejar la memoria a bajo nivel (Como lo que mencionas), deberás aprender C.
Volver arriba
dudusx



Registrado: 05 Nov 2008
Mensajes: 19

MensajePublicado: 12/11/2008 1:55 pm
Título:

Hola Jawir,

Entiendo que quieres compartir memoria entre threads de distintos procesos, siendo de otro modo no necesitarias memoria compartida.

El problema es que la memoria compartida es un servicio del sistema operativo, como bien dices, en unix/linux se emplean las funciones shmget y shmat en Windows en cambio se emplearian CreateFileMapping y MapViewOfFile.

Estas funciones "mapean" paginas fisicas en el espacio de memoria virtual de un proceso. El problema es que Java no permite tener un manejo directo sobre el control de memoria como bien ha dicho arioxcc.

Salu2
Volver arriba
scanfernan



Registrado: 15 Ago 2005
Mensajes: 149
Ubicación: PUEBLA,PUE

MensajePublicado: 22/02/2009 6:02 pm
Título:

Una posible solucion a esto es crear una clase Variabe_Compartida, y crear dentro los datos que quieres compartir con tus threads, el programa principal seria el encargado de crear una instancia de Variabe_Compartida, y pasarle la referencia a cada Thread, al crearlo o con algun metodo setVC(Variabe_Compartida v), eso es como lo hice para los clasicos problemas de concurrencia(Filosofos, Productor consumidor, Barbero, etc..).
Suerte Very Happy Exclamation
_________________
- Si el Debuggear es el proceso de remover Bugs, entonces el programar debe ser el proceso de ponerlos.
Volver arriba
igorlor



Registrado: 23 Oct 2009
Mensajes: 2

MensajePublicado: 23/10/2009 1:44 am
Título:

scanfernan escribió:
Una posible solucion a esto es crear una clase Variabe_Compartida, y crear dentro los datos que quieres compartir con tus threads, el programa principal seria el encargado de crear una instancia de Variabe_Compartida, y pasarle la referencia a cada Thread, al crearlo o con algun metodo setVC(Variabe_Compartida v), eso es como lo hice para los clasicos problemas de concurrencia(Filosofos, Productor consumidor, Barbero, etc..).
Suerte Very Happy Exclamation


A mi con eso me surge una duda, ¿Como paso esa istancia al hilo?Si lo paso vía constructor solo sería accesible en el "metodo" contructor y no en el run que es quien realmente ejecuta el hijo. Al metodo run no puedo pasarle la istancia porque no se referencia directamente sino vía hilo.start().
¿Como lo haces tú? ¿Podrias ponerme un ejemplo por favor?
Muchas gracias
Volver arriba
scanfernan



Registrado: 15 Ago 2005
Mensajes: 149
Ubicación: PUEBLA,PUE

MensajePublicado: 23/10/2009 11:47 am
Título:

Código:
package Ejemplo;
import java.io.*;
public class Principal
{
private VariableCompartida vc;
private Hilo1 h1;
private Hilo2 h2;
public Principal()
{
vc=new VariableCompartida();
h1=new Hilo1(vc);
h2=new Hilo2(vc);
}
public void inicia()
{
   h1.start();
   h2.start();
}
public static void main(String args[])
{
   Principal p=new Principal();
   p.inicia();
}
}


Código:

package Ejemplo;
public class Hilo1 extends Thread{
private VariableCompartida vc;
public Hilo1(VariableCompartida vc)
{
   this.vc=vc;
}
public void run()
{

      for(int i=0;i<100;i++)
      {
      vc.decrementa();
      System.out.println(vc.lee());
      try{
         sleep((int)(Math.random()*1000));
      }catch(InterruptedException e){}
      }
      try{
         sleep(100);
      }catch(InterruptedException e){}
}
}

Código:
package Ejemplo;
public class Hilo2 extends Thread{
private VariableCompartida vc;
public Hilo2(VariableCompartida vc)
{
   this.vc=vc;
}
public void run()
{

      for(int i=0;i<100;i++)
      {
      vc.incrementa();
      System.out.println(vc.lee());
      try{
         sleep((int)(Math.random()*1000));
      }catch(InterruptedException e){}
      }
      try{
         sleep(100);
      }catch(InterruptedException e){}
   }
}


Código:
package Ejemplo;
public class VariableCompartida{
   private int x;
   public VariableCompartida()
   {
      x=0;
   }
   public void decrementa()
   {
       x--;
   }
   public void incrementa()
   {
       x++;
   }   
   public int lee()
   {
      return x;
   }
}


Un ejemplo rapido, falta el metodo de sincronizacion, ya que si lo ejecutas, notaras que aveces x termina con un valor diferente de 0
_________________
- Si el Debuggear es el proceso de remover Bugs, entonces el programar debe ser el proceso de ponerlos.
Volver arriba
igorlor



Registrado: 23 Oct 2009
Mensajes: 2

MensajePublicado: 26/10/2009 3:35 am
Título:

Muchas gracias por tu respuesta,

Un saludo
Volver arriba
      Índice del Foro elrincondelc.com -> Java
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com