dmd-concurrency
Shammah Chancellor
anonymous at coward.com
Fri Nov 22 15:21:33 PST 2013
On 2013-11-22 23:14:44 +0000, Chris Williams said:
> On Friday, 22 November 2013 at 22:35:47 UTC, Shammah Chancellor wrote:
>> On 2013-11-22 22:34:19 +0000, Shammah Chancellor said:
>>
>> Edit, I see that you have receiveAll.. I didn't notice that. However,
>> that still doesn't satisfy the problem when you want to do receive()
>> for your Tid, and receiveAll() from your channels.
>
> receiveAll() could pull from the thread's personal message box as well
> as all of its subscribed channels, so that it truly was a "receive ALL".
>
> My thoughts for reasons to avoid that, however, are:
>
> 1. Threads always have their own message box allocated - even if it's
> empty - whereas with channels, at most you only have as many message
> boxes as you subscribed to. So my thinking was that if people are
> unlikely to mix channels-based systems and direct-sends in the same
> application, then every call to receiveAll() is having to spend an
> extra cycle checking the direct-send message box.
>
> 2. Since a Channel is just an interface, the implementation of which
> can vary, anyone who wanted to implement a NetworkedDuplicateChannel()
> class would be able to do so and pass it into a module that only
> includes std.concurency. This allows the actual implementation of any
> given channel to behave completely different from one another and
> quickly port code from one type to the other. send()/receive() are just
> innate to threads, however, and can't be replaced except by changing
> the import in each file to something else. Knowing that and also
> knowing that any direct-messaging system would probably be built like a
> channel (so that it had a constructor/init function where an IP and
> port could be configured, and perhaps an explicit startListening()
> method to call), I don't see anyone trying to override send()/receive()
> as their method for receiving direct messages over the network. They
> would still use the Channel interface, so there's not much value in
> trying to tie the two together.
I am suggesting you define a particular type of message to be received,
and then send that to the Thread/Fiber's MessageQueue. Then the
Channel is just an interface to broadcast messages to all the
subscribers of a particular channel. Then each thread need only poll
one queue.
More information about the Digitalmars-d
mailing list