Threading challenge: calculate fib(45) while spinning

Imperatorn johan_forsberg_86 at hotmail.com
Fri Oct 15 10:20:58 UTC 2021


On Friday, 15 October 2021 at 03:54:17 UTC, Ali Çehreli wrote:
> On 10/14/21 8:35 PM, jfondren wrote:
>> [...]
>
> Here is one that uses receiveTimeout and OwnerTerminated:
>
> import std.stdio;
> import std.concurrency;
> import core.thread;
>
> void main() {
>   spawnLinked(&spinner, 100.msecs);
>   enum n = 45;
>   const fibN = fib(n); // slow
>   writefln!"\rFibonacci(%d) = %d"(n, fibN);
> }
>
> void spinner(const(Duration) delay) {
>   for (;;) {
>     foreach (r; `-\|/`) {
>       writef!"\r%c"(r);
>       stdout.flush();
>       bool done;
>       receiveTimeout(delay,
>                      (OwnerTerminated msg) {
>                        done = true;
>                      });
>       if (done) {
>         return;
>       }
>     }
>   }
> }
>
> auto fib(int x) {
>   if (x < 2) {
>     return x;
>   }
>   return fib(x-1) + fib(x-2);
> }
>
> Ali

This is a "similar" approach to what Erlang does. I have always 
liked it ☀️


More information about the Digitalmars-d-learn mailing list