Message Passing and Shared Data

Robert Jacques sandford at jhu.edu
Mon Apr 11 07:45:54 PDT 2011


On Mon, 11 Apr 2011 04:13:48 -0400, Graham St Jack  
<Graham.StJack at internode.on.net> wrote:

> On 11/04/11 15:18, Jonathan M Davis wrote:
>>> I'm working on an application that makes use of message passing to
>>> separate things that need to be responsive from tasks that may take
>>> some time, and I'm having trouble because my message passing
>>> discipline isn't meshing with D's type system. I'm pretty much
>>> following the contract that when I send a message from one thread to
>>> another, the original thread doesn't store any references to the
>>> message or what's in it, IE ownership is transferred. The receiving
>>> thread may then send some of the same objects back after some
>>> processing, but again, ownership is transferred.
>>> This has the benefit that I avoid a lot of memory allocations, but it
>>> means that right now, I'm constructing everything as shared, then
>>> casting it away to populate the object, then sending the object, then
>>> casting shared away again in the receiver, and so on.
>>> The messages are generally passed around for things like requesting a
>>> large chunk of data that takes a while to generate and receiving
>>> objects from an IO thread that's decoding objects from sockets.
>>>
>>> Any suggestions as to how I could avoid doing casts everywhere and/or
>>> restore some sort of safety while avoiding having to reallocate every
>>> object I mess with? I've tried fiddling with __gshared, but couldn't
>>> figure out any way to use it with message passing.
>> There has been some talk of making it possible to do what you want to  
>> do with
>> a "unique" template or attribute, but it hasn't gone anywhere that I  
>> know of.
>> In particular, if it requires actual language changes, then it's  
>> unlikely to
>> change in D2. We might get some sort of template that solves the problem
>> though. I don't know.
>>
>> For the moment, however, message passing only works with immutable  
>> values. End
>> of story. So, you have to do stuff like what you've been doing if you  
>> want to
>> get around it. Essentially, you either deal just with immutable values,  
>> cast
>> to and from immutable, or use shared. However, at the moment, there's  
>> no real
>> way to "transfer ownership" of an object between threads, so message  
>> passing
>> just doesn't do quite what you want to do. There may be a solution for  
>> it in
>> the future though.
>>
>> - Jonathan M Davis
>
> Slight correction - it works with a type that passes this test:  
> !hasLocalAliasing!(T)
> That means anything without references to non-immutable data.
>
> In the example in question, it amounts to the same thing. The difference  
> is that you can send plain-old-data too.

One 'solution' would be to make a static array of length 1 (i.e. T[1]  
myT;)  of what you want to send and then pass that. This exploits a bug in  
hasIndirections as currently it returns true for all static arrays. (Bug  
5780, http://d.puremagic.com/issues/show_bug.cgi?id=5780)


More information about the Digitalmars-d mailing list