main.c 879 B

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