On Wednesday, 13 December 2023 at 12:49:14 UTC, fred wrote:
a bug ?

It helps if you explain what you're talking about so we don't have to guess.

I tried the code on my computer and it worked fine. But then figuring, you must be saying something doesn't work right, I tried it on another compiler and saw it endlessly loop.

So it ended using my dmd 2.098, looped on my dmd 2.105.... but this is actually just coincidence. Consider this:

---
    void s2()
    {
        shared(bool) isDone = false;
        spawn(&w2, &isDone);
        Thread.sleep(400.msecs);
        w("done");
        isDone = true;
    }
---

The variable `isDone` is temporary; as a local variable, it ceases to exist when s2 returns. So when w2 tries to check if it is done or not, it takes a bit of luck for the memory to still be the same value as it was; it has likely been recycled or otherwise cleared by then.

You need to keep the variable alive until *both* threads are done with it, either by doing some fancy synchronization between the threads or just letting the garbage collector manage the shared variable:


```
    void s2()
    {
         // let the GC do it
        shared(bool)* isDone = new shared bool;
        spawn(&w2, isDone);
        Thread.sleep(400.msecs);
        w("done");
        *isDone = true;
    }
```
  • question fred via Digitalmars-d-learn
    • Re: question Basile B. via Digitalmars-d-learn
    • Re: question Adam D Ruppe via Digitalmars-d-learn

Reply via email to