Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

C# - Multiproceso

Un hilo se define como la ruta de ejecución de un programa. Cada subproceso define un flujo de control único. Si su aplicación involucra operaciones complicadas y que consumen mucho tiempo, a menudo es útil establecer diferentes rutas de ejecución o subprocesos, con cada subproceso realizando un trabajo en particular.

Los hilos son procesos ligeros . Un ejemplo común del uso de subprocesos es la implementación de la programación concurrente por parte de los sistemas operativos modernos. El uso de subprocesos ahorra el desperdicio del ciclo de la CPU y aumenta la eficiencia de una aplicación.

Hasta ahora, escribimos los programas en los que un solo subproceso se ejecuta como un solo proceso, que es la instancia en ejecución de la aplicación. Sin embargo, de esta manera la aplicación puede realizar un trabajo a la vez. Para hacer que ejecute más de una tarea a la vez, podría dividirse en subprocesos más pequeños.

Ciclo de vida del subproceso

El ciclo de vida de un subproceso comienza cuando se crea un objeto de la clase System.Threading.Thread y finaliza cuando el subproceso finaliza o completa la ejecución.

Los siguientes son los diversos estados en el ciclo de vida de un hilo:

El hilo principal

En C#, el System.Threading.Thread La clase se utiliza para trabajar con hilos. Permite crear y acceder a subprocesos individuales en una aplicación multiproceso. El primer subproceso que se ejecuta en un proceso se denomina principal hilo.

Cuando un programa C# comienza a ejecutarse, el subproceso principal se crea automáticamente. Los hilos creados usando el Hilo class se denominan subprocesos secundarios del subproceso principal. Puede acceder a un hilo utilizando CurrentThread propiedad de la clase Thread.

El siguiente programa demuestra la ejecución del subproceso principal −

Demostración en vivo
using System;
using System.Threading;

namespace MultithreadingApplication {
   class MainThreadProgram {
      static void Main(string[] args) {
         Thread th = Thread.CurrentThread;
         th.Name = "MainThread";
         
         Console.WriteLine("This is {0}", th.Name);
         Console.ReadKey();
      }
   }
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado −

This is MainThread

Propiedades y métodos de la clase Thread

La siguiente tabla muestra algunas de las propiedades más utilizadas del Hilo clase −

Sr.No. Propiedad y descripción
1

Contexto actual

Obtiene el contexto actual en el que se ejecuta el subproceso.

2

Cultura actual

Obtiene o establece la referencia cultural del hilo actual.

3

Principio actual

Obtiene o establece el principal actual del subproceso (para la seguridad basada en funciones).

4

Subproceso actual

Obtiene el hilo actualmente en ejecución.

5

Cultura UI actual

Obtiene o establece la cultura actual utilizada por el Administrador de recursos para buscar recursos específicos de la cultura en tiempo de ejecución.

6

Contexto de ejecución

Obtiene un objeto ExecutionContext que contiene información sobre los distintos contextos del subproceso actual.

7

Está Vivo

Obtiene un valor que indica el estado de ejecución del subproceso actual.

8

EsFondo

Obtiene o establece un valor que indica si un subproceso es o no un subproceso en segundo plano.

9

IsThreadPoolThread

Obtiene un valor que indica si un subproceso pertenece o no al grupo de subprocesos administrados.

10

Id de subproceso administrado

Obtiene un identificador único para el subproceso administrado actual.

11

Nombre

Obtiene o establece el nombre del subproceso.

12

Prioridad

Obtiene o establece un valor que indica la prioridad de programación de un subproceso.

13

Estado del hilo

Obtiene un valor que contiene los estados del subproceso actual.

La siguiente tabla muestra algunos de los métodos más utilizados del Hilo clase −

Sr.No. Método y descripción
1

Anulación de anulación pública()

Genera una ThreadAbortException en el subproceso en el que se invoca, para comenzar el proceso de terminación del subproceso. Llamar a este método generalmente termina el hilo.

2

LocalDataStoreSlot público estático AllocateDataSlot()

Asigna una ranura de datos sin nombre en todos los subprocesos. Para un mejor rendimiento, utilice campos que estén marcados con el atributo ThreadStaticAttribute en su lugar.

3

LocalDataStoreSlot público estático AllocateNamedDataSlot(nombre de cadena)

Asigna una ranura de datos con nombre en todos los subprocesos. Para un mejor rendimiento, utilice campos que estén marcados con el atributo ThreadStaticAttribute en su lugar.

4

vacío estático público BeginCriticalRegion()

Notifica a un host que la ejecución está a punto de ingresar a una región de código en la que los efectos de una interrupción de subproceso o una excepción no controlada podrían poner en peligro otras tareas en el dominio de la aplicación.

5

vacío estático público BeginThreadAffinity()

Notifica a un host que el código administrado está a punto de ejecutar instrucciones que dependen de la identidad del subproceso del sistema operativo físico actual.

6

vacío estático público EndCriticalRegion()

Notifica a un host que la ejecución está a punto de ingresar a una región de código en la que los efectos de un aborto de subproceso o una excepción no controlada se limitan a la tarea actual.

7

vacío estático público EndThreadAffinity()

Notifica a un host que el código administrado ha terminado de ejecutar instrucciones que dependen de la identidad del subproceso del sistema operativo físico actual.

8

vacío estático público FreeNamedDataSlot(nombre de cadena)

Elimina la asociación entre un nombre y un slot, para todos los subprocesos del proceso. Para un mejor rendimiento, utilice campos que estén marcados con el atributo ThreadStaticAttribute en su lugar.

9

Objeto estático público GetData (ranura LocalDataStoreSlot)

Recupera el valor de la ranura especificada en el subproceso actual, dentro del dominio actual del subproceso actual. Para un mejor rendimiento, utilice campos que estén marcados con el atributo ThreadStaticAttribute en su lugar.

10

Dominio de aplicación estático público GetDomain()

Devuelve el dominio actual en el que se está ejecutando el subproceso actual.

11

Dominio de aplicación estático público GetDomainID()

Devuelve un identificador de dominio de aplicación único

12

LocalDataStoreSlot público estático GetNamedDataSlot(nombre de cadena)

Busca una ranura de datos con nombre. Para un mejor rendimiento, utilice campos que estén marcados con el atributo ThreadStaticAttribute en su lugar.

13

Interrupción de vacío público()

Interrumpe un subproceso que se encuentra en el estado de subproceso WaitSleepJoin.

14

Unión vacía pública()

Bloquea el subproceso de llamada hasta que finaliza un subproceso, mientras continúa realizando el bombeo estándar de COM y SendMessage. Este método tiene diferentes formas sobrecargadas.

15

MemoryBarrier() vacío estático público

Sincroniza el acceso a la memoria de la siguiente manera:el procesador que ejecuta el subproceso actual no puede reordenar las instrucciones de tal manera que los accesos a la memoria anteriores a la llamada a MemoryBarrier se ejecuten después de los accesos a la memoria que siguen a la llamada a MemoryBarrier.

16

vacío estático público ResetAbort()

Cancela una cancelación solicitada para el hilo actual.

17

setData público estático vacío (ranura LocalDataStoreSlot, datos de objeto)

Establece los datos en la ranura especificada en el subproceso que se está ejecutando actualmente, para el dominio actual de ese subproceso. Para un mejor rendimiento, utilice campos marcados con el atributo ThreadStaticAttribute en su lugar.

18

Inicio vacío público()

Inicia un hilo.

19

Sueño vacío público estático (int milisegundosTiempo de espera)

Hace que el hilo se detenga por un período de tiempo.

20

vacío estático público SpinWait(int iteraciones)

Hace que un subproceso espere la cantidad de veces definida por el parámetro de iteraciones

21

byte estático público VolatileRead (dirección de byte de referencia)

public static double VolatileRead(dirección doble de referencia)

public static int VolatileRead(ref int address)

Objeto estático público VolatileRead (dirección de objeto ref)

Lee el valor de un campo. El valor es el último escrito por cualquier procesador en una computadora, independientemente de la cantidad de procesadores o el estado de la memoria caché del procesador. Este método tiene diferentes formas sobrecargadas. Solo algunos se dan arriba.

22

public static void VolatileWrite (dirección de byte de referencia, valor de byte)

public static void VolatileWrite(dirección doble de referencia, valor doble)

public static void VolatileWrite(ref dirección int, valor int)

public static void VolatileWrite(dirección de objeto ref, valor de objeto)

Escribe un valor en un campo inmediatamente, de modo que el valor sea visible para todos los procesadores de la computadora. Este método tiene diferentes formas sobrecargadas. Solo algunos se dan arriba.

23

Rendimiento bool estático público()

Hace que el subproceso de llamada ceda la ejecución a otro subproceso que está listo para ejecutarse en el procesador actual. El sistema operativo selecciona el subproceso al que ceder el paso.

Creación de hilos

Los hilos se crean extendiendo la clase Thread. La clase Thread extendida luego llama al Start() método para comenzar la ejecución del subproceso secundario.

El siguiente programa demuestra el concepto −

Demostración en vivo
using System;
using System.Threading;

namespace MultithreadingApplication {
   class ThreadCreationProgram {
      public static void CallToChildThread() {
         Console.WriteLine("Child thread starts");
      }
      static void Main(string[] args) {
         ThreadStart childref = new ThreadStart(CallToChildThread);
         Console.WriteLine("In Main: Creating the Child thread");
         Thread childThread = new Thread(childref);
         childThread.Start();
         Console.ReadKey();
      }
   }
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado −

In Main: Creating the Child thread
Child thread starts

Gestión de hilos

La clase Thread proporciona varios métodos para administrar hilos.

El siguiente ejemplo demuestra el uso de sleep() método para pausar un hilo durante un período de tiempo específico.

Demostración en vivo
using System;
using System.Threading;

namespace MultithreadingApplication {
   class ThreadCreationProgram {
      public static void CallToChildThread() {
         Console.WriteLine("Child thread starts");
         
         // the thread is paused for 5000 milliseconds
         int sleepfor = 5000; 
         
         Console.WriteLine("Child Thread Paused for {0} seconds", sleepfor / 1000);
         Thread.Sleep(sleepfor);
         Console.WriteLine("Child thread resumes");
      }
      
      static void Main(string[] args) {
         ThreadStart childref = new ThreadStart(CallToChildThread);
         Console.WriteLine("In Main: Creating the Child thread");
         
         Thread childThread = new Thread(childref);
         childThread.Start();
         Console.ReadKey();
      }
   }
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado −

In Main: Creating the Child thread
Child thread starts
Child Thread Paused for 5 seconds
Child thread resumes

Destrucción de hilos

El Cancelar() se usa para destruir hilos.

El tiempo de ejecución aborta el hilo lanzando una ThreadAbortException . Esta excepción no se puede capturar, el control se envía a finalmente bloqueo, si lo hay.

El siguiente programa ilustra esto −

Demostración en vivo
using System;
using System.Threading;

namespace MultithreadingApplication {
   class ThreadCreationProgram {
      public static void CallToChildThread() {
         try {
            Console.WriteLine("Child thread starts");
            
            // do some work, like counting to 10
            for (int counter = 0; counter <= 10; counter++) {
               Thread.Sleep(500);
               Console.WriteLine(counter);
            }
            
            Console.WriteLine("Child Thread Completed");
         } catch (ThreadAbortException e) {
            Console.WriteLine("Thread Abort Exception");
         } finally {
            Console.WriteLine("Couldn't catch the Thread Exception");
         }
      }
      static void Main(string[] args) {
         ThreadStart childref = new ThreadStart(CallToChildThread);
         Console.WriteLine("In Main: Creating the Child thread");
         
         Thread childThread = new Thread(childref);
         childThread.Start();
         
         //stop the main thread for some time
         Thread.Sleep(2000);
         
         //now abort the child
         Console.WriteLine("In Main: Aborting the Child thread");
         
         childThread.Abort();
         Console.ReadKey();
      }
   }
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado −

In Main: Creating the Child thread
Child thread starts
0
1
2
In Main: Aborting the Child thread
Thread Abort Exception
Couldn't catch the Thread Exception 

Lenguaje C

  1. Diámetro de rosca menor vs mayor de sujetadores
  2. Hilo
  3. Hilo vs. ZigBee (para ingenieros de IoT)
  4. Analizando opciones de tratamiento de hilos
  5. Tutorial de subprocesos múltiples en Java con programa y ejemplos
  6. Multihilo C++
  7. Python - Programación multiproceso
  8. Edge Computing finalmente obtiene un marco
  9. La iluminación de la parte trasera se acelera
  10. Entendiendo el hilo digital
  11. ¿Qué es un cortador de hilo?