elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Mensajes
Páginas: 1 [2]
11  Programación / Java / Re: Acceder y modificar una variable global desde distintos threads en: 6 Febrero 2019, 23:58 pm
La razón de que actualmente no te funcione es que los tipos primitivos como int se copian cuando los pasas como parámetro. Al copiarse, es otro objeto diferente, y aunque lo modifiques, el original se queda igual. Para pasar objetos, tendrías que utilizar clases en vez de tipos primitivos.

Tendrías que meter la variable dentro de una clase y compartir un objeto de esa clase con las 2 que lo van a modificar. Otra opción es tenerlo como variable static y que accedan directamente a ella.

Dado que el acceso concurrente te acabaría dando problemas, puedes usar la clase AtomicInteger que sirve precisamente para eso: Modificar un int desde varios hilos. Podrías crearla en el main, y pasárselo al constructor de los otros 2 como haces ahora.

Al final lo he resuelto pasando la propia clase como has dicho. No me ha hecho falta usar AtomicInteger.

Dejo el código para quien pudiera estar interesado:

Clase principal:
Código:
public class Principal {
public volatile static int x;

public Principal() {
x = 0;
}

public static void main(String[] args) throws InterruptedException {
Incrementador[] inc = new Incrementador[1000];
Decrementador[] dec = new Decrementador[1000];

Thread hiloinc;
Thread hilodec;

for(int i=0; i<1000; i++) {
inc[i] = new Incrementador();
dec[i] = new Decrementador();

hiloinc = new Thread(inc[i]);
hilodec = new Thread(dec[i]);

hiloinc.start();
hilodec.start();

hiloinc.join();
hilodec.join();
}

System.out.println(x);
}
}

Clase Incrementador:
Código:
public class Incrementador implements Runnable {
public void run() {
Principal.x = Principal.x+1;
}
}

Clase Decrementador:
Código:

public class Decrementador implements Runnable {
public void run() {
Principal.x = Principal.x-1;
}
}


Gracias a todos!
12  Programación / Java / Re: Acceder y modificar una variable global desde distintos threads en: 6 Febrero 2019, 23:31 pm
Gracias por una respuesta tan elaborada, pero justamente lo que pretendo no es que funcione de manera sincronizada, sino que falle y provocar una condición de carrera. La finalidad es meramente académica.

Muchísimas gracias otra vez.
13  Programación / Java / Re: Acceder y modificar una variable global desde distintos threads en: 6 Febrero 2019, 20:57 pm
Tomo nota, muchísimas gracias.
14  Programación / Java / Acceder y modificar una variable global desde distintos threads en: 6 Febrero 2019, 20:20 pm
Buenas,

estoy intentando que una variable global de tipo int sea modificada por dos tipos de procesos: uno que le suma 1 y otro que le resta 1. Para ello he creado dos clases que implementan Runnable: una llamada Incrementador y otra llamada Decrementador. El problema que tengo es que no se cómo hacer para que desde la clase principal que crea e inicia los procesos se comparta la variable para ir sumándole y restándole uno simultáneamente un número de veces concretas. He intentado pasarla cuando instancio ambas clases en la principal antes de iniciar los procesos pero en el momento que paso por parámetro la variable que se modifica es la propia de las clases Incrementador y Decrementador.

(En el código de la clase principal de a continuación solo ejecuto el proceso del incrementador para comprobar si le suma 1)

Código clase principal:
Código:
public class Principal {
public static volatile int x = 0;

public static void main(String[] args) {
Incrementador inc = new Incrementador(x);
Thread hilo = new Thread(inc);
hilo.start();
System.out.println(x);
}
}

Código del incrementador:
Código:
public class Incrementador implements Runnable {
private int x;

public Incrementador(int x) {
this.x = x;
}

public void run() {
x=x+1;
}
}

Código del Decrementador:
Código:
public class Decrementador implements Runnable {
private int x;

public Decrementador(int x) {
this.x = x;
}

public void run() {
x=x-1;
}
}


Muchas gracias de antemano!
15  Programación / Programación C/C++ / Re: Problema entrada estándar en: 4 Diciembre 2018, 23:54 pm
Ese es mi problema, justo.

Muchas gracias, por la atención de nuevo.
16  Programación / Programación C/C++ / Re: Problema entrada estándar en: 4 Diciembre 2018, 22:36 pm
Muchas gracias por responder,

he adaptado tu respuesta a mi problema, por lo cual he puesto:

Código
  1. # include <stdio.h>
  2. # include <string.h>
  3.  
  4. int main(){      
  5.    char temp[2048];
  6.    if(strncmp(temp, "\n", 4)){
  7.      fgets(temp,2048,stdin);
  8.      printf("%s",temp);
  9.    }
  10.  
  11.   return 0;
  12. }
  13.  

el problema que tengo es que si pongo echo "123456" | ./programa me devuelve lo que quiero, que es 123456, sin embargo si lo escribo solo ./programa se queda esperando a que introduzca algo para imprimirlo por pantalla, y eso es lo que no quiero que ocurra; lo que necesito es que si ejecuto ./programa se ejecute y acabe sin esperar a que introduzca nada.

Muchas gracias otra vez.
17  Programación / Programación C/C++ / Re: Problema entrada estándar en: 4 Diciembre 2018, 18:50 pm
Muchas gracias por responder, el problema que tengo es que si yo en el terminal escribo:

echo "123456" | ./programa

el número de argumentos es 1, que, si no me equivoco, es el propio programa, y si escribo:

./programa

el número de argumentos también es 1.

Esto me impide diferenciar cuando escribo el programa de la forma ./programa, que debería no devolver nada, y el echo "123456" | ./programa que debería devolver 123456.

Muchas gracias.
18  Programación / Programación C/C++ / Problema entrada estándar en: 4 Diciembre 2018, 18:26 pm
Buenas a todos,

suponiendo que se tiene el archivo programa.c, que imprime la cadena que se le pasa por entrada estándar en el terminal de la siguiente forma:

echo "abcdef" | ./programa

como puedo hacer para que imprima abcdef por salida estándar, y que si ejecuto el programa sin entrada

./programa

que no imprima nada y no se quede esperando a introducir nada por teclado.

Muchas gracias a todos.
Páginas: 1 [2]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines