Pasarle trabajo a un hilo en C
Un struct de argumentos por hilo, para que nada se comparta por accidente.
#include <pthread.h>
typedef struct {
const int *values;
size_t start;
size_t end;
long sum;
} Task;
static void *sum_range(void *arg) {
Task *task = arg;
task->sum = 0;
for (size_t i = task->start; i < task->end; i++) {
task->sum += task->values[i];
}
return NULL;
}
long parallel_sum(const int *values, size_t n, Task *tasks, size_t workers) {
pthread_t threads[8];
size_t chunk = (n + workers - 1) / workers;
for (size_t w = 0; w < workers; w++) {
size_t start = w * chunk;
tasks[w].values = values;
tasks[w].start = start;
tasks[w].end = (start + chunk < n) ? start + chunk : n;
pthread_create(&threads[w], NULL, sum_range, &tasks[w]);
}
long total = 0;
for (size_t w = 0; w < workers; w++) {
pthread_join(threads[w], NULL);
total += tasks[w].sum;
}
return total;
}
Cómo funciona
- Un puntero a un arreglo de structs le da a cada hilo el suyo.
- El struct lleva la entrada y el lugar para el resultado.
- La memoria debe sobrevivir al hilo: nada de locales de un marco muerto.
Palabras clave y builtins usados aquí
NULLconstforintlongreturnsize_tstaticstructtypedefvoid
El intento, en números
- Líneas
- 37
- Caracteres a escribir
- 774
- Tokens
- 253
- Ritmo de tres estrellas
- 100 tpm
Al ritmo de tres estrellas de 100 tokens por minuto, este intento toma unos 152 segundos.
Paso 2 de 3 en Arrancar hilos; paso 2 de 10 en Hilos y concurrencia.