1#include <stdio.h> 2#include <stdlib.h> 3#include <unistd.h> 4 5#include <uv.h> 6 7#define FIB_UNTIL 25 8uv_loop_t *loop; 9 10long fib_(long t) { 11 if (t == 0 || t == 1) 12 return 1; 13 else 14 return fib_(t-1) + fib_(t-2); 15} 16 17void fib(uv_work_t *req) { 18 int n = *(int *) req->data; 19 if (random() % 2) 20 sleep(1); 21 else 22 sleep(3); 23 long fib = fib_(n); 24 fprintf(stderr, "%dth fibonacci is %lu\n", n, fib); 25} 26 27void after_fib(uv_work_t *req, int status) { 28 fprintf(stderr, "Done calculating %dth fibonacci\n", *(int *) req->data); 29} 30 31int main() { 32 loop = uv_default_loop(); 33 34 int data[FIB_UNTIL]; 35 uv_work_t req[FIB_UNTIL]; 36 int i; 37 for (i = 0; i < FIB_UNTIL; i++) { 38 data[i] = i; 39 req[i].data = (void *) &data[i]; 40 uv_queue_work(loop, &req[i], fib, after_fib); 41 } 42 43 return uv_run(loop, UV_RUN_DEFAULT); 44} 45