Underc0de

Programación General => C / C++ => Mensaje iniciado por: Jimeno en Enero 19, 2015, 07:27:17 PM

Título: Introducción a THREADS en C
Publicado por: Jimeno en Enero 19, 2015, 07:27:17 PM
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?

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í: http://pubs.opengroup.org/onlinepubs/007908799/xsh/pthread.h.html)

Veamos el código de ejemplo que crearemos:
/*
* 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:
(http://i.imgur.com/pkrJBdR.png)
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.