Introducción a THREADS en C

Iniciado por Jimeno, Enero 19, 2015, 07:27:17 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Enero 19, 2015, 07:27:17 PM Ultima modificación: Enero 19, 2015, 07:30:45 PM por Jimeno
Buenas.
Se trata de una introducción al uso de threads con C. El código que se utilizará para explicarlos será un contador hasta 1.000.000.

Antes de nada debemos preguntarnos una cosa:
¿QUÉ ES UN THREAD?
En sistemas operativos, un hilo de ejecución, hebra o subproceso es la unidad de procesamiento más pequeña que puede ser planificada por un sistema operativo. (WIKIPEDIA)

¿QUÉ VENTAJAS NOS OFRECEN LOS THREADS?

  • Tardamos menos en generar un nuevo thread dentro de un proceso que generar un proceso nuevo.
  • Tardamos menos en finalizar un thread que un proceso.
  • Es más rápido saltar entre threads que hacerlo entre procesos.

Para llevar a cabo esta tarea usaremos la biblioteca pthread.h en nuestro código (quien quiera leer su documentación completa puede hacerlo aquí: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta)

Veamos el código de ejemplo que crearemos:
Código: c
/*
* Autor: Jimeno
* Uso de threads en C.
*      Compilar: clear && gcc -Wall -Wextra -o a.out -O4 -pthread example.c && ./a.out
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>

#define THREADS 2
#define MAX   1000000

struct tdata {
int tid;
};

unsigned long counter = 0;

void *go(void *pointer) {
unsigned long i;
unsigned long max = MAX/THREADS;
int tid = ((struct tdata *)pointer)->tid;
for (i = 0; i < max; i++) {
counter += 1;
}
printf("Counter number %d - value: %lu\n", tid, counter);
pthread_exit(NULL);
        return NULL;
}

int main(void) {
int creator, i;
pthread_t threads[THREADS];
struct tdata id[THREADS];

for (i = 0; i < THREADS; i++) {
id[i].tid = i;
creator = pthread_create(&threads[i], NULL, go, (void *)&id[i]);
if (creator != 0) {
printf("ERROR creating thread number %d\n", i);
exit(-1);
}
printf("\n");
}
for (i = 0; i < THREADS; i++) {
pthread_join(threads[i], NULL);
usleep(1);
printf("main is running...\n");
}

printf("\nFinal value: %lu\nExpected value: %d\n", counter, MAX);
return 0;
}


OUTPUT:

Vemos que identificaremos nuestros threads por su ID (tid). Por tanto si el objetivo que nos hemos marcado es crear un contador hasta un millón y hemos dividido nuestro código en dos threads, veremos que cada thread alcanza el valor de 500.000. En la segunda línea de la función go hacemos esta tarea, creamos un valor máximo para cada thread.


Estoy de exámenes finales y no me da tiempo a escribir más hoy, en cuanto pueda saco la segunda parte.
Saludos.
Contacto: @migueljimeno96 -