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.

Reply via email to