SlideShare una empresa de Scribd logo
1 de 37
Descargar para leer sin conexión
TECNOLÓGICO NACIONAL DE MEXICO INSTITUTO
TECNOLÓGICO DE PINOTEPA
ASIGNATURA: TOPICOS AVANZADOS DE PROGRAMACIÓN
TEMA: PROGRAMACION CONCURRENTE
NOMBRE DEL ESTUDIANTE:
DAVID BAUTISTA ALBERTO
CARRERA: ING.SISTEMAS COMPUTACIONALES
DOCENTE: ING. EUGENIA TERESA LOZANO AGUIRRE
SEMESTRE: ENE-JUN 2023
FECHA:27 DE FEBRERO DEL 2023
Concepto de hilo.
• Un hilo es un proceso que se está ejecutando en un momento
determinado en nuestro sistema operativo, como cualquier otra tarea,
esto se realiza directamente en el procesador.
• Existen los llamados “demonios” que son los procesos que define el
sistema operativo en sí para poder funcionar y otros que llamaremos los
hilos definidos por el usuario o por el programador, estos últimos son
procesos a los que el programador define un comportamiento e inicia
en un momento específico.
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
• En .NET, cuando se lanza una aplicación se crea un proceso y dentro de este
proceso un hilo de ejecución o thread para el método main().
• Es posible, a la vez que se ejecuta el método main(), que la aplicación lance
internamente nuevos hilos de ejecución en los que se ejecute el código de
algún método.
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
• Un ejemplo muy actual de utilización de threads es una aplicación de tipo
servidor Web, como el IIS, Apache Web Server, etc.
• Un servidor Web es una aplicación que, al ser lanzada y creado para ella un
proceso y un hilo para el método main(), espera a que llegue una petición
http de un cliente al puerto que escucha (el 80 generalmente) y cuando
llega hace dos cosas:
• Crea un nuevo hilo de ejecución o thread en el que atiende la petición.
• Vuelve inmediatamente (en el hilo principal) a escuchar el puerto para
atender nuevas peticiones (mientras se atiende la petición en el nuevo
hilo).
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
• En equipos con menos procesadores que hilos o threads lanzados en un
momento dado, se habla de concurrencia aparente, ya que todos los hilos no
pueden estar ejecutándose a la vez.
• No obstante, no se ha de pensar que tener un solo procesador hace inútil
lanzar más de un hilo o thread simultáneamente. Ni mucho menos, el 100%
del tiempo de ejecución de un hilo no está ocupado el procesador
(interacción con el usuario, entrada/salida, acceso a memoria), de modo que
otro hilo puede aprovechar sus tiempos muertos.
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
• También es cierto que un exceso de threads o hilos resulta negativo, ya que
se puede perder más tiempo “saltando” de un thread a otro que en la
ejecución real (a esta operación se la llama “conmutación de contexto” e
implica salvar y recuperar datos y registros de memoria).
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
• En Windows, aunque sólo se disponga de un procesador, se permite
ejecutar varios hilos simultáneamente (concurrencia aparente). Lo que se
hace es ofrecer un tiempo determinado de ejecución (time slice o “rodaja
de tiempo”) a cada hilo (realmente son milisegundos). Cuando ese tiempo
finaliza, Windows retoma el control y se lo cede a otro thread.
• De este modo se ofrece al usuario la ilusión de tener varias aplicaciones en
ejecución simultáneamente y también se optimiza el uso de los recursos. A
este modo de organizar la ejecución de varios threads se le llama
preemptive multitasking (“multitarea preemptiva”).
• En realidad, el sistema operativo y cualquier hilo que se lance ya son dos
hilos, con lo cual la ejecución en Windows es siempre multihilo.
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
La clase Thread.
• Esta clase pertenece al namespace System.Threading. Para crear un thread
sólo hay que crear una instancia de esta clase. Sus métodos más importantes
son:
•start: lanza el thread a ejecución.
•suspend: detiene momentáneamente la ejecución del thread.
•resume: activa el thread suspendido, es decir, lo vuelve a poner en
ejecución.
•abort: aborta o para de modo inmediato la ejecución del thread.
•join: detiene el thread donde se invoca hasta que el thread para el que se
le invoca termina.
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
• Las propiedades más interesantes de la clase Thread son:
• Name: permite darle un nombre a un thread que lo distinga del
resto.
• CurrentThread: contiene una referencia al thread que está
actualmente en ejecución.
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
Ejecución de un thread
• Un thread no es más que un bloque de código vacío por defecto que es
posible lanzar a ejecución de modo simultáneo a otros threads.
• Supóngase que se desea crear una aplicación desde la que se lance un
thread que referencie una función que muestre 10 veces un mensaje (“Hola,
soy el thread”) en la consola. La aplicación lanzará también la función desde
el thread principal de la aplicación (main).
• El código necesario para crearlo es el siguiente:
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
TÓPICOS AVANZADOS DE PROGRAMACIÓN
Detener y activación de un Thread
• Una vez un thread ha sido lanzado puede ser suspendido (suspend),
reactivado (resume) o abortado (abort).
• suspend y resume: suspend suspende la ejecución de un thread
momentáneamente.
• Un thread suspendido puede ser reactivado llamando a resume. Si no se
utilizan bien pueden causar situaciones de bloqueo no recuperables.
• abort: lanza una excepción ThreadAbortException en el thread. El
tratamiento por defecto para esta excepción es finalizar la ejecución del
thread. No obstante si se captura la excepción, se puede programar el
tratamiento que se desee.
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
Propiedades Name y CurrentThread
• Con la propiedad Name puede darse nombre a ambos threads; y
• La propiedad CurrentThread puede obtenerse el thread principal
para darle nombre.
Propiedad Join
• El método Join pertenece a la clase Thread y lo que hace es detener
la ejecución del thread donde se invoca hasta que el thread para el
que se invoca termina.
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
Por ejemplo:
TÓPICOS AVANZADOS DE PROGRAMACIÓN
TÓPICOS
AVANZADOS
DE
PROGRAMACIÓN
TÓPICOS
AVANZADOS
DE
PROGRAMACIÓN
Consideraciones
Application.Run(): Esta instrucción ejecuta una forma como aplicación, es
la apropiada para abrir un nuevo hilo.
Cierra la aplicación actual. Se debe tener cuidado al
utilizarla ya que si hay hilos que fueron ejecutados por
esta aplicación se cerrarán también. Lo mejor es usarla
solo en el formulario principal.
Esta instrucción es la más apropiada para cerrar una
forma que fue abierta como hilo ya que solo cierra el
formulario o hilo actual pero no cierra la aplicación.
Application.Exit():
this.close():
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
Ejercicio: Abecedario con Hilos
Realice un programa utilizando hilos que haga lo siguiente:
• Debe lanzar 10 hilos que desplieguen el abecedario inglés en minúsculas
(códigos ascii del 65 al 90)
• Cada hilo debe tener un nombre que haga referencia al número de hilo
actual y se debe desplegar cuando se lanza por primera vez, y también junto
a cada letra del abecedario.
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
TÓPICOS
AVANZADOS
DE
PROGRAMACIÓN
TÓPICOS
AVANZADOS
DE
PROGRAMACIÓN
Prioridades
• Cuando se lanzan varios threads para que se ejecuten simultáneamente, se
les asignan las “rodajas de tiempo” en función del valor que tenga su
propiedad Priority.
• La propiedad Priority es una propiedad pública de la clase Thread (no es
static). Realmente es una enumeración del tipo ThreadPriority, cuyos
posibles valores son:
TÓPICOS AVANZADOS DE PROGRAMACIÓN
Sincronización:
• La sincronización de threads consiste en asegurar que distintos threads
acceden de modo coordinado a recursos compartidos.
• El caso más sencillo es la sincronización del uso del procesador, lo cual se
lleva a cabo por el sistema operativo mediante la “multitarea preemptiva”
(“rodajas de tiempo”).
• Pero existen otras situaciones en las que la sincronización es necesaria y no
la hace por defecto el sistema operativo.
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
lock
• La sentencia lock bloquea el acceso a un bloque de código,
asegurando que sólo el thread que lo ha bloqueado tiene acceso a tal
bloque.
Supóngase la siguiente clase:
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
TÓPICOS AVANZADOS DE PROGRAMACIÓN
TÓPICOS AVANZADOS DE PROGRAMACIÓN
Clase System.Threading.Monitor
• La clase Monitor implementa el concepto de monitor de
sincronización. Del mismo modo que existe esta clase existen otras
como Mutex, etc.
• la sentencia lock equivale a utilizar un Monitor llamando a sus
métodos Enter (al comienzo del bloque) y Exit (al final del bloque).
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
Los métodos más importantes de la clase monitor son:
• Enter: bloquea el segmento de código al que precede.
• TryEnter: es similar a Enter pero no bloquea o produce sólo un bloqueo
temporal.
• Exit: libera el bloque.
• Wait: Detiene al thread que lo llama (muy importante, no bloquea el código
a otros threads sino que detiene al thread llamador) dejándolo en espera de
que otro thread le notifique que puede seguir mediante el método Pulse.
También libera el bloqueo que haya hecho ese thread si es que lo hay.
• Pulse: notifica a un thread en la cola de espera (Wait) que puede continuar.
• PulseAll: realiza la notificación a todos los threads de la cola de espera.
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
A continuación, como ejemplo, se sustituye en el ejercicio anterior lock por las
correpondientes llamadas a Enter y Exit en la clase Monitor.
int Realizar_Transaccion(int cantidad) {
//comentar este método para ver el problema de no usarlo
Monitor.Enter(this);
{
if (saldo >= cantidad) {
Thread.Sleep(5);
saldo = saldo - cantidad;
System.Console.Write
(Thread.CurrentThread.Name.ToString());
System.Console.WriteLine ("-- Saldo= " +saldo.ToString());
Monitor.Exit(this);
return saldo;
} else
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
{ // continuacion del Else
//si el balance es menor que la cantidad que se desea retirar
//se deniega la transacción
System.Console.Write
(Thread.CurrentThread.Name.ToString());
System.Console.Write ("-- Transacción denegada.");
System.Console.WriteLine ("-- El saldo sería= " +(saldo - cantidad));
Monitor.Exit(this);
return 0;
}
}
}
Nota: Se puede observar que las llamadas a Exit han de ser antes de return o no se
ejecutarán.
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
• Clase Mutex (Mutual Exclusion); Su funcionalidad es asegurar que
solamente un hilo pueda tener a acceso a un recurso, o porción de
código, esta clase puede ser usada para evitar que múltiples instancias de
una aplicación sean iniciadas.
• Aparentemente la funcionalidad de la clase Mutex es muy parecida a
Lock, una de las grandes diferencias entre ellas es que Mutex es una clase
y Lock es una Instrucción, la funcionalidad de Mutex es mayor ya que
permite manejar bloqueo a nivel de Sistema Operativo, de tal forma que
actúa a nivel de proceso.
• Cuando un Hilo adquiere una exclusión mutua (mutex), el siguiente Hilo
que intenta adquirir dicha exclusión mutua se suspende hasta que el
primer subproceso libera la exclusión mutua.
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
• Existen dos tipo de exclusiones mutuas: exclusiones mutuas locales y
exclusiones mutuas del sistema con nombre.
• Si crea un objeto Mutex con un constructor que acepta un nombre, se
asocia a un objeto del sistema operativo con dicho nombre. Las
exclusiones mutuas del sistema con nombre son visibles en todo el
sistema operativo y se pueden utilizar para sincronizar las actividades de
los procesos.
• Con respecto al desempeño de la utilización de Mutex Vs Lock, La
instrucción Lock es mucho mas rápida que la utilización de la clase Mutex.
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
• Para utilizar la clase Mutex , se requiere el método WaitOne el cual
obtiene el bloqueo exclusivo de un contenido a bloquear. Dicho
bloque es liberado con el método ReleaseMutex. De la misma forma
que se bloqueo con Lock , la clase Mutex puede ser liberada
únicamente con la terminación del hilo que la llamo.
private static Mutex mut = new Mutex();
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
• Ejemplo
private static Mutex mut = new Mutex();
public void Sumar() {
mut.WaitOne();
Console.WriteLine("{0} Ingresando de Codigo Protegido",
Thread.CurrentThread.Name);
resultado = operador1 + operador2;
//Bloqueamos el Hilo actual durante un segundo
Thread.Sleep(1000);
Console.WriteLine("El resultado de la Suma es:" + resultado);
Console.WriteLine("{0} Saliendo de Codigo
Protegidon",Thread.CurrentThread.Name);
mut.ReleaseMutex();
}
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
Problema de los filósofos comensales:
• Hay cinco filósofos sentados alrededor de una mesa que pasan su vida
cenando y pensando. Cada uno dispone de un plato de arroz y un
palillo a la izquierda de su plato, pero para comer son necesarios dos
palillos y cada filósofo sólo puede sujetar el que está a su izquierda o
el que hay a su derecha. Con un solo palillo en la mano no tienen más
remedio que esperar hasta que atrapen otro y puedan seguir
comiendo.
• Si dos filósofos adyacentes intentan tomar el mismo palillo a la vez se
produce una condición de carrera: ambos compiten por lo mismo
pero uno se queda sin comer.
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
• Si todos los filósofos cogen el palillo de su derecha al mismo tiempo,
todos se quedarán esperando eternamente porque alguien debe
liberar el palillo que les falta, cosa que nadie hará porque todos se
encuentran en la misma situación (esperando que alguno deje su
palillo). Llegado esto, los filósofos se morirán de hambre. A este
bloqueo mutuo se le denomina interbloqueo o deadlock.
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
El objetivo consiste en encontrar un recurso que permita que los filósofos
nunca se mueran de hambre. Porque:
• Dos filósofos contiguos no pueden comer a la vez (exclusión mutua).
• Si un filósofo está comiendo, los contiguos no pueden hacerlo hasta
que él termine (sincronización).
• El filósofo que termina de comer debe ceder los palillos para su
posterior utilización (interbloqueo).
TÓPICOS AVANZADOS DE
PROGRAMACIÓN
Bibliografía
• Patrick LeBlanc. 2015. Microsoft Visual C# 2013 Step by Step. EE. UU. Octal
Publishing, Inc. ISBN: 978-0-7356-8183-5.
TÓPICOS AVANZADOS DE
PROGRAMACIÓN

Más contenido relacionado

Similar a DIAPOSITIVAS UNIDAD3.pdf

Similar a DIAPOSITIVAS UNIDAD3.pdf (20)

Thread
ThreadThread
Thread
 
Chap 15fpin
Chap 15fpinChap 15fpin
Chap 15fpin
 
Thread
ThreadThread
Thread
 
Programación multitarea
Programación multitareaProgramación multitarea
Programación multitarea
 
Programación multihebra en java
Programación multihebra en javaProgramación multihebra en java
Programación multihebra en java
 
Tema 12 hilos en java por gio
Tema 12   hilos en java por gioTema 12   hilos en java por gio
Tema 12 hilos en java por gio
 
2o departamental Programacion 3
2o departamental Programacion 32o departamental Programacion 3
2o departamental Programacion 3
 
Thread 01
Thread 01Thread 01
Thread 01
 
Uso de hilos
Uso de hilosUso de hilos
Uso de hilos
 
Java Threads (Hilos en Java)
Java Threads (Hilos en Java)Java Threads (Hilos en Java)
Java Threads (Hilos en Java)
 
Multitarea
MultitareaMultitarea
Multitarea
 
Threads.pdf
Threads.pdfThreads.pdf
Threads.pdf
 
Clase 3 ene 8
Clase 3 ene 8Clase 3 ene 8
Clase 3 ene 8
 
Threads en java
Threads en javaThreads en java
Threads en java
 
Threads en Java
Threads en JavaThreads en Java
Threads en Java
 
Hilos
HilosHilos
Hilos
 
Hilos
HilosHilos
Hilos
 
hilos informatica
hilos informatica hilos informatica
hilos informatica
 
Lab5 guia
Lab5 guiaLab5 guia
Lab5 guia
 
Programacion concurrente
Programacion concurrenteProgramacion concurrente
Programacion concurrente
 

Último

5to Cuadernillo de matematicas_voces.pdf
5to Cuadernillo de matematicas_voces.pdf5to Cuadernillo de matematicas_voces.pdf
5to Cuadernillo de matematicas_voces.pdf
RosiClaros
 

Último (6)

SES-VIERNES 17-CYT-CONOCEMOS NUESTRO SISTEMA NERVIOSO.docx
SES-VIERNES 17-CYT-CONOCEMOS NUESTRO SISTEMA NERVIOSO.docxSES-VIERNES 17-CYT-CONOCEMOS NUESTRO SISTEMA NERVIOSO.docx
SES-VIERNES 17-CYT-CONOCEMOS NUESTRO SISTEMA NERVIOSO.docx
 
Prueba_1er_grado_......de_Secundaria.pdf
Prueba_1er_grado_......de_Secundaria.pdfPrueba_1er_grado_......de_Secundaria.pdf
Prueba_1er_grado_......de_Secundaria.pdf
 
5to Cuadernillo de matematicas_voces.pdf
5to Cuadernillo de matematicas_voces.pdf5to Cuadernillo de matematicas_voces.pdf
5to Cuadernillo de matematicas_voces.pdf
 
casa-citrohan-parte-de-línea-de-tiempo-arquitectura
casa-citrohan-parte-de-línea-de-tiempo-arquitecturacasa-citrohan-parte-de-línea-de-tiempo-arquitectura
casa-citrohan-parte-de-línea-de-tiempo-arquitectura
 
Hardware y Software: Esencia Tecnológica
Hardware y Software: Esencia TecnológicaHardware y Software: Esencia Tecnológica
Hardware y Software: Esencia Tecnológica
 
Principales sistemas operativos en el mundo
Principales sistemas operativos en el mundoPrincipales sistemas operativos en el mundo
Principales sistemas operativos en el mundo
 

DIAPOSITIVAS UNIDAD3.pdf

  • 1. TECNOLÓGICO NACIONAL DE MEXICO INSTITUTO TECNOLÓGICO DE PINOTEPA ASIGNATURA: TOPICOS AVANZADOS DE PROGRAMACIÓN TEMA: PROGRAMACION CONCURRENTE NOMBRE DEL ESTUDIANTE: DAVID BAUTISTA ALBERTO CARRERA: ING.SISTEMAS COMPUTACIONALES DOCENTE: ING. EUGENIA TERESA LOZANO AGUIRRE SEMESTRE: ENE-JUN 2023 FECHA:27 DE FEBRERO DEL 2023
  • 2. Concepto de hilo. • Un hilo es un proceso que se está ejecutando en un momento determinado en nuestro sistema operativo, como cualquier otra tarea, esto se realiza directamente en el procesador. • Existen los llamados “demonios” que son los procesos que define el sistema operativo en sí para poder funcionar y otros que llamaremos los hilos definidos por el usuario o por el programador, estos últimos son procesos a los que el programador define un comportamiento e inicia en un momento específico. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 3. • En .NET, cuando se lanza una aplicación se crea un proceso y dentro de este proceso un hilo de ejecución o thread para el método main(). • Es posible, a la vez que se ejecuta el método main(), que la aplicación lance internamente nuevos hilos de ejecución en los que se ejecute el código de algún método. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 4. • Un ejemplo muy actual de utilización de threads es una aplicación de tipo servidor Web, como el IIS, Apache Web Server, etc. • Un servidor Web es una aplicación que, al ser lanzada y creado para ella un proceso y un hilo para el método main(), espera a que llegue una petición http de un cliente al puerto que escucha (el 80 generalmente) y cuando llega hace dos cosas: • Crea un nuevo hilo de ejecución o thread en el que atiende la petición. • Vuelve inmediatamente (en el hilo principal) a escuchar el puerto para atender nuevas peticiones (mientras se atiende la petición en el nuevo hilo). TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 5. • En equipos con menos procesadores que hilos o threads lanzados en un momento dado, se habla de concurrencia aparente, ya que todos los hilos no pueden estar ejecutándose a la vez. • No obstante, no se ha de pensar que tener un solo procesador hace inútil lanzar más de un hilo o thread simultáneamente. Ni mucho menos, el 100% del tiempo de ejecución de un hilo no está ocupado el procesador (interacción con el usuario, entrada/salida, acceso a memoria), de modo que otro hilo puede aprovechar sus tiempos muertos. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 6. • También es cierto que un exceso de threads o hilos resulta negativo, ya que se puede perder más tiempo “saltando” de un thread a otro que en la ejecución real (a esta operación se la llama “conmutación de contexto” e implica salvar y recuperar datos y registros de memoria). TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 7. • En Windows, aunque sólo se disponga de un procesador, se permite ejecutar varios hilos simultáneamente (concurrencia aparente). Lo que se hace es ofrecer un tiempo determinado de ejecución (time slice o “rodaja de tiempo”) a cada hilo (realmente son milisegundos). Cuando ese tiempo finaliza, Windows retoma el control y se lo cede a otro thread. • De este modo se ofrece al usuario la ilusión de tener varias aplicaciones en ejecución simultáneamente y también se optimiza el uso de los recursos. A este modo de organizar la ejecución de varios threads se le llama preemptive multitasking (“multitarea preemptiva”). • En realidad, el sistema operativo y cualquier hilo que se lance ya son dos hilos, con lo cual la ejecución en Windows es siempre multihilo. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 8. La clase Thread. • Esta clase pertenece al namespace System.Threading. Para crear un thread sólo hay que crear una instancia de esta clase. Sus métodos más importantes son: •start: lanza el thread a ejecución. •suspend: detiene momentáneamente la ejecución del thread. •resume: activa el thread suspendido, es decir, lo vuelve a poner en ejecución. •abort: aborta o para de modo inmediato la ejecución del thread. •join: detiene el thread donde se invoca hasta que el thread para el que se le invoca termina. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 9. • Las propiedades más interesantes de la clase Thread son: • Name: permite darle un nombre a un thread que lo distinga del resto. • CurrentThread: contiene una referencia al thread que está actualmente en ejecución. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 10. Ejecución de un thread • Un thread no es más que un bloque de código vacío por defecto que es posible lanzar a ejecución de modo simultáneo a otros threads. • Supóngase que se desea crear una aplicación desde la que se lance un thread que referencie una función que muestre 10 veces un mensaje (“Hola, soy el thread”) en la consola. La aplicación lanzará también la función desde el thread principal de la aplicación (main). • El código necesario para crearlo es el siguiente: TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 11. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 12. Detener y activación de un Thread • Una vez un thread ha sido lanzado puede ser suspendido (suspend), reactivado (resume) o abortado (abort). • suspend y resume: suspend suspende la ejecución de un thread momentáneamente. • Un thread suspendido puede ser reactivado llamando a resume. Si no se utilizan bien pueden causar situaciones de bloqueo no recuperables. • abort: lanza una excepción ThreadAbortException en el thread. El tratamiento por defecto para esta excepción es finalizar la ejecución del thread. No obstante si se captura la excepción, se puede programar el tratamiento que se desee. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 13. Propiedades Name y CurrentThread • Con la propiedad Name puede darse nombre a ambos threads; y • La propiedad CurrentThread puede obtenerse el thread principal para darle nombre. Propiedad Join • El método Join pertenece a la clase Thread y lo que hace es detener la ejecución del thread donde se invoca hasta que el thread para el que se invoca termina. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 17. Consideraciones Application.Run(): Esta instrucción ejecuta una forma como aplicación, es la apropiada para abrir un nuevo hilo. Cierra la aplicación actual. Se debe tener cuidado al utilizarla ya que si hay hilos que fueron ejecutados por esta aplicación se cerrarán también. Lo mejor es usarla solo en el formulario principal. Esta instrucción es la más apropiada para cerrar una forma que fue abierta como hilo ya que solo cierra el formulario o hilo actual pero no cierra la aplicación. Application.Exit(): this.close(): TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 18. Ejercicio: Abecedario con Hilos Realice un programa utilizando hilos que haga lo siguiente: • Debe lanzar 10 hilos que desplieguen el abecedario inglés en minúsculas (códigos ascii del 65 al 90) • Cada hilo debe tener un nombre que haga referencia al número de hilo actual y se debe desplegar cuando se lanza por primera vez, y también junto a cada letra del abecedario. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 21. Prioridades • Cuando se lanzan varios threads para que se ejecuten simultáneamente, se les asignan las “rodajas de tiempo” en función del valor que tenga su propiedad Priority. • La propiedad Priority es una propiedad pública de la clase Thread (no es static). Realmente es una enumeración del tipo ThreadPriority, cuyos posibles valores son: TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 22. Sincronización: • La sincronización de threads consiste en asegurar que distintos threads acceden de modo coordinado a recursos compartidos. • El caso más sencillo es la sincronización del uso del procesador, lo cual se lleva a cabo por el sistema operativo mediante la “multitarea preemptiva” (“rodajas de tiempo”). • Pero existen otras situaciones en las que la sincronización es necesaria y no la hace por defecto el sistema operativo. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 23. lock • La sentencia lock bloquea el acceso a un bloque de código, asegurando que sólo el thread que lo ha bloqueado tiene acceso a tal bloque. Supóngase la siguiente clase: TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 24. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 25. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 26. Clase System.Threading.Monitor • La clase Monitor implementa el concepto de monitor de sincronización. Del mismo modo que existe esta clase existen otras como Mutex, etc. • la sentencia lock equivale a utilizar un Monitor llamando a sus métodos Enter (al comienzo del bloque) y Exit (al final del bloque). TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 27. Los métodos más importantes de la clase monitor son: • Enter: bloquea el segmento de código al que precede. • TryEnter: es similar a Enter pero no bloquea o produce sólo un bloqueo temporal. • Exit: libera el bloque. • Wait: Detiene al thread que lo llama (muy importante, no bloquea el código a otros threads sino que detiene al thread llamador) dejándolo en espera de que otro thread le notifique que puede seguir mediante el método Pulse. También libera el bloqueo que haya hecho ese thread si es que lo hay. • Pulse: notifica a un thread en la cola de espera (Wait) que puede continuar. • PulseAll: realiza la notificación a todos los threads de la cola de espera. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 28. A continuación, como ejemplo, se sustituye en el ejercicio anterior lock por las correpondientes llamadas a Enter y Exit en la clase Monitor. int Realizar_Transaccion(int cantidad) { //comentar este método para ver el problema de no usarlo Monitor.Enter(this); { if (saldo >= cantidad) { Thread.Sleep(5); saldo = saldo - cantidad; System.Console.Write (Thread.CurrentThread.Name.ToString()); System.Console.WriteLine ("-- Saldo= " +saldo.ToString()); Monitor.Exit(this); return saldo; } else TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 29. { // continuacion del Else //si el balance es menor que la cantidad que se desea retirar //se deniega la transacción System.Console.Write (Thread.CurrentThread.Name.ToString()); System.Console.Write ("-- Transacción denegada."); System.Console.WriteLine ("-- El saldo sería= " +(saldo - cantidad)); Monitor.Exit(this); return 0; } } } Nota: Se puede observar que las llamadas a Exit han de ser antes de return o no se ejecutarán. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 30. • Clase Mutex (Mutual Exclusion); Su funcionalidad es asegurar que solamente un hilo pueda tener a acceso a un recurso, o porción de código, esta clase puede ser usada para evitar que múltiples instancias de una aplicación sean iniciadas. • Aparentemente la funcionalidad de la clase Mutex es muy parecida a Lock, una de las grandes diferencias entre ellas es que Mutex es una clase y Lock es una Instrucción, la funcionalidad de Mutex es mayor ya que permite manejar bloqueo a nivel de Sistema Operativo, de tal forma que actúa a nivel de proceso. • Cuando un Hilo adquiere una exclusión mutua (mutex), el siguiente Hilo que intenta adquirir dicha exclusión mutua se suspende hasta que el primer subproceso libera la exclusión mutua. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 31. • Existen dos tipo de exclusiones mutuas: exclusiones mutuas locales y exclusiones mutuas del sistema con nombre. • Si crea un objeto Mutex con un constructor que acepta un nombre, se asocia a un objeto del sistema operativo con dicho nombre. Las exclusiones mutuas del sistema con nombre son visibles en todo el sistema operativo y se pueden utilizar para sincronizar las actividades de los procesos. • Con respecto al desempeño de la utilización de Mutex Vs Lock, La instrucción Lock es mucho mas rápida que la utilización de la clase Mutex. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 32. • Para utilizar la clase Mutex , se requiere el método WaitOne el cual obtiene el bloqueo exclusivo de un contenido a bloquear. Dicho bloque es liberado con el método ReleaseMutex. De la misma forma que se bloqueo con Lock , la clase Mutex puede ser liberada únicamente con la terminación del hilo que la llamo. private static Mutex mut = new Mutex(); TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 33. • Ejemplo private static Mutex mut = new Mutex(); public void Sumar() { mut.WaitOne(); Console.WriteLine("{0} Ingresando de Codigo Protegido", Thread.CurrentThread.Name); resultado = operador1 + operador2; //Bloqueamos el Hilo actual durante un segundo Thread.Sleep(1000); Console.WriteLine("El resultado de la Suma es:" + resultado); Console.WriteLine("{0} Saliendo de Codigo Protegidon",Thread.CurrentThread.Name); mut.ReleaseMutex(); } TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 34. Problema de los filósofos comensales: • Hay cinco filósofos sentados alrededor de una mesa que pasan su vida cenando y pensando. Cada uno dispone de un plato de arroz y un palillo a la izquierda de su plato, pero para comer son necesarios dos palillos y cada filósofo sólo puede sujetar el que está a su izquierda o el que hay a su derecha. Con un solo palillo en la mano no tienen más remedio que esperar hasta que atrapen otro y puedan seguir comiendo. • Si dos filósofos adyacentes intentan tomar el mismo palillo a la vez se produce una condición de carrera: ambos compiten por lo mismo pero uno se queda sin comer. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 35. • Si todos los filósofos cogen el palillo de su derecha al mismo tiempo, todos se quedarán esperando eternamente porque alguien debe liberar el palillo que les falta, cosa que nadie hará porque todos se encuentran en la misma situación (esperando que alguno deje su palillo). Llegado esto, los filósofos se morirán de hambre. A este bloqueo mutuo se le denomina interbloqueo o deadlock. TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 36. El objetivo consiste en encontrar un recurso que permita que los filósofos nunca se mueran de hambre. Porque: • Dos filósofos contiguos no pueden comer a la vez (exclusión mutua). • Si un filósofo está comiendo, los contiguos no pueden hacerlo hasta que él termine (sincronización). • El filósofo que termina de comer debe ceder los palillos para su posterior utilización (interbloqueo). TÓPICOS AVANZADOS DE PROGRAMACIÓN
  • 37. Bibliografía • Patrick LeBlanc. 2015. Microsoft Visual C# 2013 Step by Step. EE. UU. Octal Publishing, Inc. ISBN: 978-0-7356-8183-5. TÓPICOS AVANZADOS DE PROGRAMACIÓN