Actualización de matriz utilizando Hilos booleanos volátiles

petegoast:

Soy un estudiante de CS actualmente está aprendiendo acerca de la programación concurrente por lo que mi conocimiento sobre las discusiones todavía, uh, tentativa.

Sólo estoy un poco atascado en la lógica de actualización de un conjunto compartido con hilos. Estoy creando un programa que permite a un número potencialmente infinito de hilos de actualizar constantemente una matriz booleana de tamaño 10 para simular la idea de una zona de estar donde la gente puede entrar, sentarse por un periodo de tiempo aleatorio, y luego se van. Aquí está mi código:

class Viewer extends Thread{
    private String name;
    private int index;
    volatile boolean[] seats;


    Viewer(boolean[] st, String n){
        seats = st;
        name = n;
    }

    public void run() {
        ViewingStand vs = new ViewingStand(seats);
        this.index = vs.findSeat(name, seats);
            try {
                Thread.sleep((long)(Math.random() * 1000));
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            seats = vs.leaveSeat(name, seats, index);

    }
}

class ViewingStand{
    private volatile boolean[] area; //the array used by threads
    private int seatNo; //index of whatever area is being taken or left.
    Random rand = new Random();
    boolean found = false;

    public ViewingStand(boolean st[]){
    this.area = st;
    }

    public int findSeat(String s, boolean[] seats){
        this.area = seats;
        while(found == false) {
            for(int i=0; i < area.length; i++) {
                if(area[i] == true) {
                    found = true;
                    this.seatNo = i; 
                    area[seatNo] = false;
                    System.out.println(s + " has found a seat.");
                    return this.seatNo;
                }
            }
            System.out.println(s + " has started searching again.");
        }
        return -1; //should never reach this
    }

    public boolean[] leaveSeat(String s, boolean[] area, int n){
        this.area = area;
        this.area[n] = false;
        System.out.println(s + " has left their seat.");
        return this.area;
    }

El resultado de este programa es la matriz inicialmente conseguir lleno con 10 elementos (el tamaño de la matriz pasé desde el programa principal), esos hilos entonces dejan 'un' matriz, pero claramente no es el mismo que estoy pasando hacia atrás y adelante entre ambos métodos ViewingStand, ya que cada hilo posterior después del día 10 se atasca en busca de un asiento. Me encantaría alguna entrada para que me señale en la dirección correcta. ¡Gracias!

Krease:

Voy a ignorar los problemas de concurrencia en un primer momento e ir directamente a lo que parece ser el error lógico que estés preguntando por - leaveSeates el ajuste this.area[n] = false- lo que parece indicar que se toma el asiento (su findSeatmétodo supone un asiento está vacío si el valor es true) .

Por problemas de concurrencia: es muy probable que tenga problemas con su lazo de control de los asientos - es posible que varios subprocesos para determinar un asiento está vacío (y entran en el bloque if), y todo "reclamo" el mismo asiento. Usted debe construir una instancia de ViewingStandy tienen que administrar el acceso a los asientos - utilizando los controles de concurrencia como synchronizedo de bloqueo para asegurar múltiples hilos no modifican el estado de los asientos al mismo tiempo.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=232462&siteId=1
Recomendado
Clasificación