dmd-concurrency

Shammah Chancellor anonymous at coward.com
Fri Nov 22 20:18:47 PST 2013


On 2013-11-23 01:46:22 +0000, Chris Williams said:

> On Friday, 22 November 2013 at 23:21:33 UTC, Shammah Chancellor wrote:
>> On 2013-11-22 23:14:44 +0000, Chris Williams said:
>> 
>> 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.
> 
> With a SingleChannel, that's not really an option. Theoretically, it 
> could choose a random subscriber with space in its MessageBox as the 
> next recipient, but there would be no guarantee that a thread which had 
> just decided to shut itself down hadn't been selected, in which case 
> the message would be lost. The channel really needs to have an internal 
> queue that all the threads look at when they call receive.
> 
> For DuplicateChannel, I could indeed go and copy the data into each 
> individual thread's box, so that it only had to check there for 
> messages during receive (if not subscribed to any SingleChannel 
> instances), but I would still need to have the logic in place to scan 
> for in-channel boxes because of SingleChannel, in which case I might as 
> well establish the presence of boxes in channels as the norm for 
> DuplicateChannel as well.
> 
> This does give us the advantage that if the user requests calls against 
> a single channel, there is no extra overhead associated with that act, 
> because it has to scan through a large list to find the appropriate 
> items. It also allows the user to customize the behavior of the 
> MessageBox on a channel-by-channel basis. Setting a "max number of 
> messages" per channel, when all messages go into the same bucket, would 
> end up wonky.

In my uses of channels, I have not found customizing the message box 
size per channel to be useful.  It may be, but it's not something I 
want.    I sitll think duplicate channels should behave the way I 
described.   Take IRC for example, where I am sending messages to other 
users, but also to channels which then broadcast.   I want my clients 
to be able to simply receive() and get messages that were intended for 
them specifically, or were broadcast.  I don't want to implement 
complex logic in order to avoid my thread hanging while trying to read 
from a channel if I have messages available that are specific to my 
thread.

With regards to SingleChannel,  picking a random thread would be bad 
for a plethora of reasons, so I agree here.  I think we should continue 
to disucss this issue.  There may be some way to get Tid.receive() to 
behave the expected way when subscribed to SingleChannels.

Also, SingleChannels seem somewhat strange in general to me though -- 
What is the expected behavior when multiple threads receive different 
types of mesages from the MessageBox?  Does it consume messages it 
doesn't understand until it finds one it does?  This would prevent 
other tasks which do understand them from processing.   What is the use 
case for SingleChannel that a simple synchronized Queue does not 
acheive?

It seems you want SingleChannel and DuplicateChannel not block each 
other for the same reason I don't want DuplicateChannels to block 
Task-specific receive()'s.   However, I think SingleChannels are the 
oddity here, and should be treated as such, rather than Tid.send()

-Shammah



More information about the Digitalmars-d mailing list