Declaración de lock en C#

Muhammad Maisam Abbas 16 febrero 2024
Declaración de lock en C#

En este tutorial, discutiremos la declaración lock en C#.

La declaración lock en C#

La declaración lock(obj) especifica que no se puede acceder a la siguiente sección de código por más de un subproceso al mismo tiempo en C#. El parámetro obj dentro de la instrucción lock(obj) es una instancia de la clase object. La declaración lock(obj) proporciona una forma eficiente de administrar subprocesos en C#. Si un hilo accede al código dentro del lock(obj) y otro hilo quiere acceder al mismo código, el segundo hilo tendrá que esperar a que el primer hilo lo ejecute. La declaración lock(obj) asegura la ejecución secuencial de la sección de código especificada. Para demostrar este fenómeno, primero le mostraremos el resultado del código sin ninguna gestión de subprocesos con la declaración lock(obj).

using System;
using System.Threading;

namespace lock_statement {
  class Program {
    static readonly object lockname = new object();
    static void display() {
      for (int a = 1; a <= 3; a++) {
        Console.WriteLine("The value to be printed is: {0}", a);
      }
    }
    static void Main(string[] args) {
      Thread firstthread = new Thread(display);
      Thread secondthread = new Thread(display);
      firstthread.Start();
      secondthread.Start();
    }
  }
}

Producción :

The value to be printed is: 1
The value to be printed is: 1
The value to be printed is: 2
The value to be printed is: 3
The value to be printed is: 2
The value to be printed is: 3

Como podemos ver, los hilos firstthread y secondthread acceden al código dentro del bucle de forma aleatoria. Le mostraremos el resultado del código con la gestión de subprocesos con la declaración lock(obj).

using System;
using System.Threading;

namespace lock_statement {
  class Program {
    static readonly object lockname = new object();
    static void display() {
      lock (lockname) {
        for (int a = 1; a <= 3; a++) {
          Console.WriteLine("The value to be printed is: {0}", a);
        }
      }
    }
    static void Main(string[] args) {
      Thread firstthread = new Thread(display);
      Thread secondthread = new Thread(display);
      firstthread.Start();
      secondthread.Start();
    }
  }
}

Producción :

The value to be printed is: 1
The value to be printed is: 2
The value to be printed is: 3
The value to be printed is: 1
The value to be printed is: 2
The value to be printed is: 3

Esta vez, tanto firstthread como secondthread acceden secuencialmente al código dentro del bucle. Podemos colocar un código en el que cambiamos el valor de una variable dentro de una declaración lock(obj) para evitar cualquier pérdida de datos.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

Artículo relacionado - Csharp Thread