Perché funziona questo buffer condiviso?

5

Sfondo

Il seguente frammento di codice è preso da un problema in, Visual C # 2005: Come programmare, di Paul e Harvey Deitel (pagine 735). Lo snippet di codice è più o meno un'applicazione per accedere ai dati utilizzando 2 thread tramite un buffer (chiamato shared ). Basta saltare il frammento di codice, e guarda sotto se vuoi una breve descrizione di cosa sta succedendo (prima di leggere la mia domanda).

// Fig. 15.8: UnsynchronizedBufferTest.cs
// Showing multiple threads modifying a shared object without
// synchronization.
using System;
using System.Threading;

class UnsynchronizedBufferTest
{
    static void Main(string[] args)
    {
        // create shared object used by threads
        UnsynchronizedBufferTest shared = new UnsynchronizedBuffer();

        // Random object used by each thread
        Random random = new Random();

        // create Producer and Consumer objects 
        Producer producer = new Producer(shared, random);
        Consumer consumer = new Consumer(shared, random);

        // create threads for producer and consumer and set
        // delegates for each thread
        Thread producerThread =
            new Thread(new ThreadStart(producer.Produce));
        producerThread.Name = "Producer";

        Thread consumerThread =
            new Thread(new ThreadStart(consumer.Consume));
        consumerThread.Name = "Consumer";

        // start each thread
        producerThread.Start();
        consumerThread.Start();
    } // end Main
} // end class UnsynchronizedBufferTest

Proprio per l'idea di base di ciò che sta succedendo qui, un thread di produzione sta eseguendo che inserisce dati in un buffer (chiamato shared ). Inoltre, un thread utente sta eseguendo che ottiene i dati dal buffer.

Gli oggetti Producer e Consumer condividono in qualche modo questo buffer, che è quello che ho difficoltà a capire. Da quello che ho sempre capito sul linguaggio C #, quando un oggetto viene passato ad un metodo, è solo una copia o istanza che viene effettivamente passata. Immagino che dev'essere sbagliato, perché quando Producer mette i dati nel buffer, Consumer lo vede ...

Il frammento di codice per il buffer (nel caso qualcuno ne abbia bisogno) è il seguente (pp. 734). Onestamente non penso che avrà nulla a che fare con la risposta, e che la risposta ha più a che fare con il linguaggio C # perché in realtà tutta questa classe rappresenta un intero.

// Fig. 15.7: UnsynchronizedBuffer.cs
// An unsynchronized shared buffer implementation.
using System;
using System.Threading;

// this class represents a single shared int
public class UnsynchronizedBuffer : Buffer
{
    // buffer shared by producer and consumer threads
    private int buffer = -1;

    // property buffer
    public int Buffer
    {
        get
        {
            Console.WriteLine("{0} reads {1}",
                Thread.CurrentThread.Name, buffer);
            return buffer;
        } // end get
        set
        {
            Console.WriteLine("{0} writes {1}",
                Thread.CurrentThread.Name, value);
            buffer = value;
        } // end set
    } // end property Buffer
} // end class UnsynchronizedBuffer

Domanda

Com'è possibile che entrambi gli oggetti (il Producer e il Consumer ) siano in grado di vedere le modifiche reciproche tra loro? (cioè quando Producer imposta i dati, Consumer può vedere i nuovi dati)

Mi manca qualcosa nella mia comprensione fondamentale di C #.

    
posta Snoop 24.05.2016 - 00:33
fonte

1 risposta

4

From what I have always understood about the C# language, when an object is passed to a method, it is only a copy or instance that actually gets passed.

Ecco dove ti stai confondendo.

Tutte le variabili in C # sono riferimenti a oggetti. L'oggetto buffer nell'esempio vive sull'heap e sia il consumatore che il produttore hanno un riferimento a quell'oggetto.

Quando si passa una variabile a una funzione, si crea una copia del riferimento, ma il nuovo riferimento punta ancora allo stesso oggetto sull'heap. Pertanto, sia il consumatore che il produttore stanno modificando lo stesso oggetto.

    
risposta data 24.05.2016 - 01:07
fonte

Leggi altre domande sui tag