Asynchronous concurrency with reference types
Denis Koroskin
2korden at gmail.com
Sat Feb 5 09:34:32 PST 2011
On Sat, 05 Feb 2011 20:42:53 +0300, Peter Alexander
<peter.alexander.au at gmail.com> wrote:
> On 5/02/11 12:11 AM, Sean Kelly wrote:
>> Peter Alexander Wrote:
>>>
>>> Things might be easier if the error messages associated with D's
>>> concurrent features weren't especially unhelpful (for example, trying
>>> to
>>> spawn a thread with reference type parameters just gives you a 'no
>>> match
>>> for spawn template' error). It's nice that it stops you from doing such
>>> things, but it would be nice if it told me why it's not going to let me
>>> do them.
>>
>> Could you provide an example? When passing reference data, the error
>> you should see is: "Aliases to mutable thread-local data not allowed."
>> It's a static assert inside send().
>
> Now that I've investigated a bit more, it appears to be unrelated to
> reference types, and instead was an error about using a nested function:
>
> import std.concurrency;
> void main()
> {
> void foo() {}
> spawn(&foo);
> }
>
> ---
> test.d(5): Error: template std.concurrency.spawn(T...) does not match
> any function template declaration
> test.d(5): Error: template std.concurrency.spawn(T...) cannot deduce
> template function from argument types !()(void delegate())
> ---
>
> Why does it think that the function is a delegate?
Because even though foo doesn't use any of the local variables (nor does
main declare any), it still has frame pointer as if it was using some:
void main()
{
int x = 42;
void foo() { printf("%d", x); }
spawn(&foo);
}
More information about the Digitalmars-d-learn
mailing list