Pregunta

Podría alguien explicar la sincronización de estado conmigo?

Un ejemplo (preferentemente en C #) sería muy apreciado también.

¿Fue útil?

Solución

Parece que su profesor está hablando de rosca. Threading permite a los programas de ordenador para hacer más de una cosa a la vez. El acto de iniciar un nuevo hilo, mientras que uno ya se está ejecutando se llama "hacer girar un hilo" por los programadores informáticos.

Los temas pueden compartir el mismo espacio de memoria. Condición de sincronización (o simplemente sincronización) es cualquier mecanismo que protege las áreas de la memoria de ser modificado por dos hilos diferentes al mismo tiempo.

Digamos que usted está fuera haciendo compras, y la mujer está en casa para pagar las cuentas. Este es un ejemplo ingenuo, y que en realidad no funciona de esta manera en la vida real, pero servirá como una simple ilustración.

Su esposa está pagando una factura en línea. Al mismo tiempo, se le pasar su tarjeta de crédito en el supermercado. Ambos actos hay que mover el dinero de su cuenta corriente. Para simular esta actividad, escribimos el siguiente código:

public class MyBanking
{
    static double myAccountBalance;
    //
    public void DebitAccount(double debitAmount)
    {
        Console.Writeline("Your Old Balance is: " + myAccountBalance.ToString());
        Console.Writeline("Your Debit is:       " + debitAmount.ToString());
        myAccountBalance = myAccountBalance - amount;
        Console.Writeline("Your New Balance is: " + myAccountBalance.ToString());
    }
}

Hipotéticamente, su esposa se está ejecutando una instancia ( "copia") de esta clase en un hilo, se está ejecutando una instancia en otro hilo. La variable se declara myAccountBalance estática para que pueda ser compartida entre ambas instancias en ejecución (usted y su esposa tiene sólo una cuenta de cheques).

Usted hace su débito llamando al código como el siguiente:

MyBanking bankingObject = new MyBanking();
bankingObject.DebitAccount(100);

Su esposa hace su débito al mismo tiempo:

MyBanking bankingObject = new MyBanking();
bankingObject.DebitAccount(50);

¿Qué pasa si el hilo se ve interrumpido por el hilo de su esposa después de que el saldo de su edad se imprime en la pantalla, pero antes de que se imprima el nuevo equilibrio? hilo de su esposa carga la cuenta y devuelve el control de nuevo a su hilo. Su esposa ve esto en la pantalla:

Your Old Balance is: 2000
Your Debit is:       50
Your New Balance Is: 1950

Cuando el equipo imprime el nuevo equilibrio en la pantalla, será mal, porque de débito de su esposa se han contabilizado también. Verá algo como esto:

Your Old Balance is: 2000
Your Debit is:       100
Your New Balance Is: 1850

Para solucionar este problema, nos rodean nuestro código de método con una declaración de bloqueo. La declaración de bloqueo hace que todos los otros hilos que esperar para nuestro ejemplo, para terminar El nuevo código es el siguiente:.

public class MyBanking
{
    static double myAccountBalance;
    //
    public void DebitAccount(double debitAmount)
    {
        lock (this)
        {
            Console.Writeline("Your Old Balance is: " + myAccountBalance.ToString());
            Console.Writeline("Your Debit is:       " + debitAmount.ToString());
            myAccountBalance = myAccountBalance - amount;
            Console.Writeline("Your New Balance is: " + myAccountBalance.ToString());
        }
    }
}

hilo de su esposa ahora esperar a que su código dentro de la instrucción lock para terminar la ejecución, antes de que el código de su esposa comienza a ejecutar. Su nuevo equilibrio ahora será correcto, porque ya no hay la posibilidad de que el hilo de su esposa cambiando el equilibrio mientras se complete la transacción. En la pantalla, ahora ver esto:

Your Old Balance is: 2000
Your Debit is:       100
Your New Balance Is: 1900

Su esposa verá esto:

Your Old Balance is: 1900
Your Debit is:       50
Your New Balance Is: 1850

Esta es la sincronización.

Otros consejos

Básicamente se trata de un patrón de diseño para las discusiones que necesitan

a) sincronizar el acceso a un recurso

b) a veces esperar a que otros hilos hasta que se cumple una ciertas condiciones

Usted pregunta esto en un contexto C #, .NET proporciona soporte para esto con Monitor.Wait y Monitor.Pulse (y con envolturas alrededor de varios objetos como Win32 WaitEventhandle).

Aquí es un buen ejemplo Cola el SO.

Los principales detalles técnicos se ven como:

lock(buffer)  // is Monitor.Enter(buffer) ... finally Monitor.Leave(buffer)
{
   while (buffer.Count < 1)
   {
      Monitor.Wait(buffer); 
   }
   ...
}

Nótese cómo hay una espera mientras está encerrado allí. Se parece a un callejón sin salida, pero espera será liberar el bloqueo mientras se está a la espera. El código dentro del lock() { } todavía tiene acceso exclusivo para amortiguar cuando se ejecuta.

Y luego otro hilo tiene que indicar cuando se pone algo en la memoria intermedia:

Monitor.Pulse(buffer);

El código anterior es casi correcta, pero es realmente malo. Mediante el uso de lock(this), sólo bloquear la instancia de la clase MyBanking, pero su esposa se bloqueará la suya. Para bloquear el acceso a la variable compartida Puede bloquear el tipo (es decir lock(typeof(MyBanking))) o se puede introducir una nueva variable compartida y bloquear que (no se puede bloquear un int por lo general la gente a crear un objeto de la siguiente manera.

class MyBanking
{
    static object lockObj = new object();
    static double myAccountBalance;
    public void DebitAccount(double debitAmount)
    {
        lock (lockObj)

La sincronización ha sido claramente explicado ya. Sin embargo, condición de sincronización dicta específicamente que un proceso / hilo ejecuta solamente después de que se cumpla alguna condición. Típicamente, la condición será que algún otro proceso / hilo ya ha ejecutado.

En el ejemplo dado de cargo a una cuenta y la visualización de la balanza. Si la visión de su saldo era un método sincronizado por separado y queríamos ver el saldo de su cuenta sólo después de que se haya adeudado, a continuación, esto requeriría la sincronización de estado.

sincronización condición es muy bien descrito por la productor-consumidor problema .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top