Message-Passing
jdrewsen
jdrewsen at nospam.com
Fri Jan 20 06:04:37 PST 2012
On Friday, 20 January 2012 at 13:10:37 UTC, Manu wrote:
> On 20 January 2012 00:36, Sean Kelly <sean at invisibleduck.org>
> wrote:
>
>> Thanks :-) If you have ideas on how it could be improved,
>> please let me
>> know.
>>
>> On Jan 19, 2012, at 12:58 PM, Nathan M. Swan wrote:
>>
>> > I want to applaud Sean Kelly and everyone who worked on
>> > std.concurrency
>> for a great API, and wish that I could easily write Cocoa
>> applications with
>> it.
>> >
>> > I'm writing a screen recording program in Objective-C, and
>> > to make sure
>> each frame has an equal length, I have two threads: one that
>> takes the
>> screenshot at certain intervals, the other that assembles it
>> into a
>> quicktime movie. After writing an implementation of a
>> thread-safe queue,
>> where the picture-taking thread adds and the assembling thread
>> removes, I
>> realized the huge similarity between what I'd done and
>> std.concurrency.
>> >
>> > The std.concurrency module would have made hours of effort
>> > in ObjC take
>> five minutes in D. Well done!
>>
>
> I had some troubles with std.concurrency which I thought it
> might be nice
> to address.
>
> Perhaps the most major problem I had was related to the concept
> of thread
> ownership. If a spawned threads parent thread dies, it also
> receives a
> signal to kill its self, but it seems impossible to reassign
> ownership.
> In my case I had threads A, B and C...
> Thread A is the main thread, which may spawn many temporary
> worker
> threads B, which may last 1-2 seconds.
> During the life of B, it may spawn C, which may persist for
> hours.
> B promptly dies, and any C's that were spawned receive the kill
> signal,
> which I ignore.
> Thread A, the main thread may exit, and I would really like all
> C's to
> receive that notification, but they were are all orphaned when
> their B died.
> The problem is, when I spawn a C, it should be created as a
> child of A
> somehow, rather than a child of the transient B... Some
> mechanism to solve
> this sort of problem would be useful.
>
> Another usability problem I had was that, intuitively, the
> simpler function
> with intuitive usage pattern receiveOnly() should be named
> receive().
> And receive() with the complex var-arg list of delegates should
> be named
> something more complex.
> receiveTimeout() has no receiveTimeoutOnly(), which is the
> function I
> almost always want to use... and receiveTimeout() didn't
> actually work for
> me anyway (it wouldn't receive a duration as per the
> documentation, I had
> to pass an int)
>
> I wonder if there is a solution to the 'shared' problem.
> Basically every
> single line of code that uses the std.concurrenty api is
> riddled with casts
> to/from shared... really ugly.
> I think the problem here is that I'm not SHARING values between
> threads,
> I'm actually passing ownership of something to another thread.
> So I wonder
> if some improvement can be made in this area.
>
> I was going to complain about the documentation, but I just
> checked, and it
> seems to have had work since I was reading it. Looks much
> better now! :)
It still needs to document that the ops in "void receive(T...)(T
ops)" can return false if they did not handle the message. This
is useful when you want to receive a message from a specific
spawned subthread (tid).
/Jonas
More information about the Digitalmars-d
mailing list