| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
Jawir
Registrado: 16 Feb 2006 Mensajes: 50
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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  _________________ - 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
| Publicado: 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  |
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
| Publicado: 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
| Publicado: 26/10/2009 3:35 am | | | Título: |
| Muchas gracias por tu respuesta,
Un saludo |
|
| Volver arriba | |
 |
|
|