Mailbox limits and dead/livelocks?

Enerqi kelvin.d.ward at googlemail.com
Tue Jul 24 09:35:31 PDT 2012


Excellent, it was a rogue exception in another program that was 
causing hangs and issues for me. Thanks :)

On Tuesday, 24 July 2012 at 15:33:34 UTC, Ali Çehreli wrote:
> On 07/24/2012 07:46 AM, Enerqi wrote:
> > The actors in std.concurrency - in this example it's
> non-deterministic
> > whether the process may or may not hang. I'm confused as to
> why. I have
> > set the mailbox sizes to 1. But the message flow seems simple
> enough. I
> > don't see how the message limit of 1 is blocking everything,
> I am
> > catching Variant messages so nothing should be in the mailbox
> unread.
>
> I have struggled with a similar problem recently. When an 
> apparent lock-up occurs, it may be because a worker has 
> terminated, likely by assert(). (There has been a thread about 
> exceptions from workers getting lost.)
>
> The trick is to start the worker with spawnLinked so that a 
> LinkTerminated exception can be received on the owner's side:
>
>
>         tids[i] = spawnLinked(&blah1, thisTid);
> // ...
>                 (LinkTerminated exc)
>                 {
>                     writeln("A worker has terminated: ", exc);
>                     // ...
>                 },
>
> The other std.concurrency exception that can be received as a 
> message is OwnerTerminated:
>
>             (OwnerTerminated exc)
>             {
>                 writeln("The owner has terminated; exiting.");
>                 isDone = true;
>             }
>
> I am in the process of updating the following page with the 
> information above:
>
>   http://ddili.org/ders/d.en/concurrency.html
>
> Ali




More information about the Digitalmars-d-learn mailing list