Can/should spawn work with functions that return?
Jonathan M Davis
jmdavisProg at gmx.com
Fri Jan 21 15:08:23 PST 2011
On Friday, January 21, 2011 14:12:18 Andrej Mitrovic wrote:
> import std.stdio;
> import std.concurrency;
>
> void foo(int var)
> {
> }
>
> bool bar(int var)
> {
> return true;
> }
>
> void barWrapper(int var)
> {
> bar(var);
> }
>
> void main()
> {
> spawn(&foo, 1);
> spawn(&barWrapper, 1);
> spawn(&bar, 1);
> }
>
> Errors:
> testSpawn.d(24): Error: template std.concurrency.spawn(T...) does not match
> any function template declaration testSpawn.d(24): Error: template
> std.concurrency.spawn(T...) cannot deduce template function from argument
> types !()(bool function(int var),int)
>
> Of course, when my foreground thread spawns a background thread it doesn't
> wait for it to finish, so assigning a return value doesn't make much
> sense. I can see how that can be an error (in any case that error message
> above is not very informative).
>
> But what if I want to spawn a thread with an existing function 'bar' that
> has side-effects, but I'm not interested in its return value even though
> it has one?
>
> Right now I'm forced to either:
> a) remove any returns from 'bar' and change it to a void function, which
> can be really complicated if other functions already depend on its return
> value, or b) write a new void function that can be called with spawn(),
> which internally calls 'bar' but discards it's value (so basically it's a
> wrapper). This is what I've done in the example code.
>
> So, is spawning threads on functions that return banned by design? I
> couldn't read about this anywhere on the D site or TDPL.
The current design does not give you any way to access a return value from a
spawned function, even if it allowed you to use such a function. And given that
fact, it really doesn't make sense conceptually to have spawn work with non-void
functions. I'm not sure that there are any technical barriers to it however.
Still, as it stands, if a function isn't _designed_ to be called with spawn, I
don't see what good it generally does you. If it's not sending messages to the
parent thread, then what's the point of calling it? You can't _have_ side effects
unless the function alters a shared global.
I do have an enhancement request related to getting return values from spawned
functions though:
http://d.puremagic.com/issues/show_bug.cgi?id=4566
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list