C# proporciona compatibilidad integrada para la programación multiproceso. Un programa de subprocesos múltiples contiene dos o más partes que pueden ejecutarse simultáneamente. Cada parte de un programa de este tipo se denomina subproceso , y cada subproceso define una ruta de ejecución separada.
Cuando se inicia un programa C#, un subproceso comienza a ejecutarse inmediatamente. Esto generalmente se llama el hilo principal de nuestro programa.
Propiedades:
- Es el subproceso bajo el cual se crearán otros subprocesos «secundarios» .
- A menudo, debe ser el último subproceso en finalizar la ejecución porque realiza varias acciones de apagado.
Ejemplo:
// C# program to illustrate the working // of main thread and child thread using System; using System.Threading; public class GFG { // Main thread static public void Main() { Console.WriteLine("Welcome to the Main thread"); // Child threads Thread thrA = new Thread(childthread); Thread thrB = new Thread(childthread); thrA.Start(); thrB.Start(); } public static void childthread() { Console.WriteLine("Welcome to the Child thread"); } }
Producción:
Welcome to the Main thread Welcome to the Child thread Welcome to the Child thread
Explicación: El programa anterior consta de un solo subproceso que se conoce como el subproceso principal . El subproceso principal funciona como cualquier otro subproceso, pero se inicia automáticamente, no es necesario que requiera ningún Start()
método para iniciar la ejecución del subproceso principal. Tanto thrA como thrB son el subproceso secundario del subproceso principal. El primer subproceso principal comienza a funcionar después de que el subproceso secundario comience a funcionar.
Para acceder al subproceso principal, necesita el objeto de clase Subproceso para consultarlo. Puede crear esto usando la propiedad CurrentThread de la clase Thread. Devolverá la referencia al hilo en el que se utilizó. Entonces, cuando usa la propiedad CurrentThread dentro del hilo principal, obtendrá la referencia del hilo principal. Después de eso, obtendrá el control sobre el hilo principal como cualquier otro hilo.
Ejemplo:
// C# program to illustrate // how to access main thread using System; using System.Threading; public class GFG { // Main Method static public void Main() { Thread thr; // Get the reference of main Thread // Using CurrentThread property thr = Thread.CurrentThread; // Display the name of // the main Thread if (thr.Name == null) { Console.WriteLine("Main thread does not have name"); } else { Console.WriteLine("The name of main "+ "thread is: {0}", thr.Name); } Console.WriteLine(); // Display the priority of main thread Console.WriteLine("The priority of main"+ " thread is: {0}", thr.Priority); // Set the name of main thread thr.Name = "Main Thread"; Console.WriteLine(); // Display the name of main thread Console.WriteLine("The name of main "+ "thread is: {0}", thr.Name); } }
Producción:
Main thread does not have name The priority of main thread is: Normal The name of main thread is: Main Thread
Podemos crear un interbloqueo simplemente usando el subproceso principal, es decir, usando solo un subproceso. El siguiente programa C# demuestra esto.
Ejemplo:
// C# program to demonstrate deadlock // using the Main thread using System; using System.Threading; public class GFG { // Main Method public static void Main() { try { Console.WriteLine("Enter into DEADLOCK!!"); Thread.CurrentThread.Join(); // the following statement // will never execute Console.WriteLine("This statement will never execute"); } catch (ThreadInterruptedException e) { e.ToString(); } } }
Producción:
Enter into DEADLOCK!!
Error de tiempo de ejecución:
Se excedió el límite máximo de tiempo real debido a una gran carga en el servidor o al usar la función de suspensión
Explicación: La declaración » Thread.currentThread().join()
«, le dirá al subproceso principal que espere a que este subproceso (es decir, se espere a sí mismo ) muera. Por lo tanto, el subproceso principal espera a que muera, lo que no es más que un punto muerto.
Publicación traducida automáticamente
Artículo escrito por ankita_saini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA