summaryrefslogtreecommitdiffstats
path: root/04_exercise/main.c
blob: 98c058096ddea7b2a58a392161b1c6d4575fbb7b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "threadpool.h"

#include <stdio.h>
#include <stdlib.h>

static TASK(long, fib, long)

long fib(long n) {
    if (n <= 1)
        return n;

    fib_fut *a = fibAsync((fib_fut[]){fibFuture(n - 1)});
    fib_fut *b = fibAsync((fib_fut[]){fibFuture(n - 2)});

    return fibAwait(a) + fibAwait(b);
}
// Show this runs with only one thread and one place in the work queue
int main() {
    setvbuf(stdout, NULL, _IONBF, 0);
    if (tpInit(4) != 0)
        perror("Thread Pool initialization failed"), exit(-1);
    atexit(&tpRelease);
    for (long i = 0; i <= 20; ++i)
        printf("fib(%2li) = %li\n", i, fib(i));

    return 0;
}