La primera estructura concurrente a estudiar es el hilo, que es la estructura más básica de concurrencia. Pese a que se trate de una estructura concurrente, a día de hoy todos los programas de ordenador usan al menos un hilo, aunque sea un programa sin concurrencia. Esto es porque los sistemas operativos modernos han integrado los hilos en sus fundamentos, por lo que todo proceso tiene al menos un hilo ejecutando las instrucciones de un programa. Otra cosa es que desde el programa solicitemos la creación de más hilos.
Pero, ¿qué es un hilo? Puedes verlo como un contexto de ejecución, que es toda la información que hay alrededor del estado en el que se encuentra un programa de ejecución, incluyendo el puntero de instrucción, para saber qué instrucción del programa es la que se está ejecutando ahora mismo; y la pila del programa, de donde se puede sacar la pila de ejecución, para saber cómo hemos llegado hasta la función en la que estamos ahora (por ejemplo; la función main() llamó a la función A() en la línea 12; la función A() llamó a la función B() en la línea 91; y la función B() llamó a la función C() en la línea 58); así como las distintas tablas de variables locales que forman parte de todas las funciones que forman parte de la pila de ejecución.
Cuando hay más de un hilo, hay más de un contexto de ejecución simultáneo para el mismo programa. Es decir, para un mismo código en ejecución tenemos múltiples punteros de instrucción con su propia traza de ejecución. Mediante las APIs del lenguaje de programación podremos crear y terminar hilos.
Los hilos tienen además cierta metainformación. En el caso de Java, por ejemplo, el nombre que le demos al hilo si es que se lo damos. También, la prioridad del hilo, es decir, cómo de crítico es que se le asigne tiempo de CPU a un hilo. Finalmente, un estado, para saber si en un momento determinado el hilo está en ejecución, está a la espera, está bloqueado por una operación IO...