\documentclass[a4paper]{article}

\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}

\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{listings}
\lstset{
	basicstyle=\ttfamily\footnotesize,
	tabsize=4,
}

\title{Práctica 5 - MFC \\ Hilos de ejecución}
\author{Carlos S. Galindo Jiménez}

\begin{document}
\maketitle

En cada caso, el resultado variará en función del scheduling que se aplique entre los distintos hilos de ejecución. En los casos apropiados, se indicará si el programa podría no terminar o si se puede producir una condición de carrera, en la cual se sobreescriba un dato en memoria de forma errónea.

\begin{enumerate}
	\item Este programa tiene 3 hilos de ejecución. En función del scheduling que se realice entre ellos, existen 4 posibles resultados:
	\begin{itemize}
		\item Si sólo se da tiempo al hilo principal, o no se da suficiente tiempo a ningún hilo hijo a escribir en la variable \texttt{x}, el resultado es 0.
		\item Si sólo un hilo escribe en la variable \texttt{x}, el resultado es 1.
		\item Si entre los dos hilos hijos generan una condición de carrera, el resultado sería 1. Esto se produce cuando los dos hilos leen el valor \texttt{x = 0}, y escriben 1 en la variable.
		\item Si los dos hilos se ejecutan sin interferencia, el valor de \texttt{x} será 2.
	\end{itemize}
	Una vez retornado el valor de \texttt{x}, su valor puede ser actualizado por alguna instrucción restante en algún hilo. El valor final será 2, menos en el caso de la condición de carrera, en el que será 1.
	\item Este caso es similar al caso anterior, pero la adquisición de los bloqueos elimina la posibilidad de la condición de carrera. Los posibles valores de \texttt{x} son 0, 1 y 2, en función del número de hilos que hayan escrito en la variable.
	\item El programa no termina nunca, por dos causas:
	\begin{itemize}
		\item Infinitos hilos de ejecución: cada hilo crea otro hilo como su primera instrucción, por lo que la cantidad mínima de hilos en cualquier momento es 2 (el principal y uno hijo).
		\item Bucle infinito: el valor de la variable \texttt{a} no se modifica, puesto que se pasa por valor como parámetro de \texttt{f}. Aunque dentro de la función se actualice el valor del parámetro, el valor de \texttt{a} no cambia. Por el mismo motivo, el valor de \texttt{x} permanece constante.
	\end{itemize}
	\item Este caso es similar al anterior, pero sin hilos de ejecución, por lo que se genera un bucle infinito de llamadas recursivas a \texttt{f}. También seguimos teniendo el bucle infinito (que nunca se llegará a ejecutar, dada la ausencia de hilos). De nuevo, el paso de parámetros por valor impediría que la llamada \texttt{f(x,a)} modificara el valor de \texttt{x} y \texttt{a}.
	\item Este caso se asemeja al tercero, pero en la función \texttt{f} se ha eliminado la llamada recursiva, por lo que sólo se crea un hilo (además del hilo principal). El problema del paso de parámetros por valor y del bucle infinito queda exactamente igual que antes.
	\item Este caso es como el anterior (5), pero sin hilos, por lo que la ejecución es lineal. Sin embargo, \texttt{a} no cambia de valor, porque es pasado por valor a \texttt{f}. El bucle no termina.
	\item Respecto a casos anteriores se ha modificado la definición, de tal manera que las variables \texttt{x} y \texttt{a} son visibles en la función. Sin embargo, ésta modifica sólo sus parámetros, por lo que las variables externas no son modificadas y el bucle sigue sin terminar.
	\item Éste es la primera versión de este programa que \textit{puede} terminar con éxito. Existen dos hilos, uno que actualiza las variables \texttt{x} y \texttt{a}, y otro que ejecuta un bucle hasta que el primer hilo se haya ejecutado la escritura sobre \texttt{a}. El resultado del programa será 1. La duración de la ejecución es variable, pudiendo ser infinita, si el scheduler no le da tiempo al hilo hijo en ningún momento.
	\item Este caso es similar al anterior, pero con un solo hilo de ejecución. La diferencia principal es que la condición del bucle fallará la primera vez. La duración de la ejecución ahora es igual en todos los posibles casos, y es lo más rápido que podía serlo en el caso anterior. El resultado seguirá siendo 1.
\end{enumerate}
\end{document}