Concurrency
Graham St Jack
Graham.StJack at internode.on.net
Sun Jul 25 22:16:54 PDT 2010
On 26/07/10 13:48, Sean Kelly wrote:
> Graham St Jack Wrote:
>
>
>> However, I have had some problems with std.concurrency (most of which
>> I'm sure are already being addressed by Sean). In particular, I wanted a
>> way to select on multiple file-descriptors so that I could (say) send
>> commands to a thread that also reads from a blocking file-descriptor
>> like a serial port, UDP socket or GTK main loop.
>>
> Hm... this is essentially what libev and libevent do. The trick is mostly making this work in a consistent and performant manner on both Posix and Windows. On Posix, the read event simply tells you data is available, while on Windows the read event hands the data to you directly. The former works quite well with messaging while the latter... well, it's kind of weird.
>
I don't know much about Windows programming, but I was expecting this to
be the sticking point. So do we have a solution in D for this? For me,
it is the key issue with std.concurrency as it stands.
Using the Pipe approach as I did in Channel, maybe a Windows version
could allow a byte to be removed from the Pipe for each message, and
another byte immediately put on to replace it if the Channel was not
then empty.
> I like that you're playing with Channels, by the way. I chose the messaging API in std.concurrency because it can have a range of more structured models built on top of it, so I think it's more likely to see broad use done this way. Maybe channels will be the first :-)
>
The Channels I proposed were really just a first try at doing code
generation, but they do work really well. I particularly like being able
to print out the generated code to see what you are getting. I must
admit that I find Variant perplexing, and had issues with the message
size limitation and no prohibition on aliased message parameters.
In working with both std.concurrency and alt.concurrency, I have found
that alt.concurrency has some advantages such as:
Creating Channels first and providing them as arguments to spawn() is
simpler than spawning threads and passing Tids in messages.
Being able to use the same set of parameter types in two different
messages, and having names for the messages is clearer.
Being able to have multiple threads reading messages from the same
Channel - something I need (well, want because it is much easier than
double-handling all the messages through an intermediary) on my current
project.
The benefit of compile-time checking.
Of course std.concurrency has lots of bonuses too. What I am after is a
discussion that leads to a std.concurrency that is better still.
By the way, how are you getting on with rolling out "shared" through
core.sync? I'm very keen to find out if shared can at last be used as
intended - such as for implementing a Channel. I could lend a hand if
you need one.
--
Graham St Jack
More information about the Digitalmars-d
mailing list