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