Thread overview
Inconsistency with function pointers
Aug 04, 2012
Russel Winder
Aug 04, 2012
Jacob Carlborg
Aug 04, 2012
Russel Winder
Aug 04, 2012
Jacob Carlborg
Aug 04, 2012
anonymous
Aug 04, 2012
David Nadlinger
Aug 04, 2012
David Nadlinger
Aug 05, 2012
Russel Winder
August 04, 2012
I am sure I am just missing something simple, but I need the nudge…

I can do:

        import core.thread ;
        import std.stdio ;

        int main(immutable string[] args) {
          auto f() { return delegate () { writeln("Hello World."); }; }
          auto t = new Thread(f);
          t.start();
          t.join();
          return 0;
        }

it is Thread(f) rather than Thread(&f) because f is a function returning
a void delegate() rather than being a void(). However:

        import core.thread ;
        import std.stdio ;

        int main(immutable string[] args) {
          auto t = new Thread( delegate () { return delegate () { writeln("Hello World."); }; } ) ;
          t.start();
          t.join();
          return 0;
        }

trial.d(7): Error: constructor core.thread.Thread.this (void function()
fn, ulong sz = cast(ulong)0) is not callable using argument types (void
delegate() delegate() pure nothrow @safe)
Failed: 'dmd' '-v' '-o-' 'trial.d' '-I.'

So I cannot use an anonymous delegate where I can use a named delegate?
-- 
Russel. ============================================================================= Dr Russel Winder      t: +44 20 7585 2200   voip: sip:russel.winder@ekiga.net 41 Buckmaster Road    m: +44 7770 465 077   xmpp: russel@winder.org.uk London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder


August 04, 2012
On 2012-08-04 17:06, Russel Winder wrote:
> I am sure I am just missing something simple, but I need the nudge…
>
> I can do:
>
>          import core.thread ;
>          import std.stdio ;
>
>          int main(immutable string[] args) {
>            auto f() { return delegate () { writeln("Hello World."); }; }
>            auto t = new Thread(f);
>            t.start();
>            t.join();
>            return 0;
>          }
>
> it is Thread(f) rather than Thread(&f) because f is a function returning
> a void delegate() rather than being a void(). However:
>
>          import core.thread ;
>          import std.stdio ;
>
>          int main(immutable string[] args) {
>            auto t = new Thread( delegate () { return delegate () { writeln("Hello World."); }; } ) ;
>            t.start();
>            t.join();
>            return 0;
>          }
>
> trial.d(7): Error: constructor core.thread.Thread.this (void function()
> fn, ulong sz = cast(ulong)0) is not callable using argument types (void
> delegate() delegate() pure nothrow @safe)
> Failed: 'dmd' '-v' '-o-' 'trial.d' '-I.'
>
> So I cannot use an anonymous delegate where I can use a named delegate?

If you take a look at the declaration of the constructor for "Thread" you can see that it expects a function pointer. I'm not sure what's happening in the first example. I don't think any of the above examples should work.

-- 
/Jacob Carlborg
August 04, 2012
Jacob,

On Sat, 2012-08-04 at 18:02 +0200, Jacob Carlborg wrote:
> On 2012-08-04 17:06, Russel Winder wrote:
> > I am sure I am just missing something simple, but I need the nudge…
> >
> > I can do:
> >
> >          import core.thread ;
> >          import std.stdio ;
> >
> >          int main(immutable string[] args) {
> >            auto f() { return delegate () { writeln("Hello World."); }; }

Changing this to function makes no difference to the fact that this works.

> >            auto t = new Thread(f);

Put &f here and the compiler says:

threadFunctionPointerTrial.d(6): Error: constructor core.thread.Thread.this (void function() fn, ulong sz = cast(ulong)0) is not callable using argument types (void function() delegate())
threadFunctionPointerTrial.d(6): Error: cannot implicitly convert expression (&f) of type void function() delegate() to void delegate()
Failed: 'dmd' '-v' '-o-' 'threadFunctionPointerTrial.d' '-I.'

> >            t.start();
> >            t.join();
> >            return 0;
> >          }
> >
> > it is Thread(f) rather than Thread(&f) because f is a function returning
> > a void delegate() rather than being a void(). However:
> >
> >          import core.thread ;
> >          import std.stdio ;
> >
> >          int main(immutable string[] args) {
> >            auto t = new Thread( delegate () { return delegate () { writeln("Hello World."); }; } ) ;
> >            t.start();
> >            t.join();
> >            return 0;
> >          }
> >
> > trial.d(7): Error: constructor core.thread.Thread.this (void function()
> > fn, ulong sz = cast(ulong)0) is not callable using argument types (void
> > delegate() delegate() pure nothrow @safe)
> > Failed: 'dmd' '-v' '-o-' 'trial.d' '-I.'
> >
> > So I cannot use an anonymous delegate where I can use a named delegate?
> 
> If you take a look at the declaration of the constructor for "Thread" you can see that it expects a function pointer. I'm not sure what's happening in the first example. I don't think any of the above examples should work.

Isn't there an overload for function and one for delegate?

threadFunctionPointerUnnamed.d(5): Error: constructor core.thread.Thread.this called with argument types:
	((void function()))
matches both:
	core.thread.Thread.this(void function() fn, ulong sz = cast(ulong)0)
and:
	core.thread.Thread.this(void delegate() dg, ulong sz = cast(ulong)0)
Failed: 'dmd' '-v' '-o-' 'threadFunctionPointerUnnamed.d' '-I.'

-- 
Russel. ============================================================================= Dr Russel Winder      t: +44 20 7585 2200   voip: sip:russel.winder@ekiga.net 41 Buckmaster Road    m: +44 7770 465 077   xmpp: russel@winder.org.uk London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder


August 04, 2012
On Saturday, 4 August 2012 at 15:23:39 UTC, Russel Winder wrote:
[...]
> I can do:
[...]
>           auto f() { return delegate () { writeln("Hello World."); }; }
>           auto t = new Thread(f);
[...]
> However:
[...]
>           auto t = new Thread( delegate () { return delegate () { writeln("Hello World."); }; } ) ;
[doesn't work]

You need parentheses to call the anonymous delegate:
auto t = new Thread( delegate () { return delegate () {
writeln("Hello World."); }; }()) ;

You don't need them with f, because there you have to write &f to
refer to the delegate itself. (And because you don't use
-property.)

August 04, 2012
On 2012-08-04 18:41, Russel Winder wrote:

> Isn't there an overload for function and one for delegate?
>
> threadFunctionPointerUnnamed.d(5): Error: constructor core.thread.Thread.this called with argument types:
> 	((void function()))
> matches both:
> 	core.thread.Thread.this(void function() fn, ulong sz = cast(ulong)0)
> and:
> 	core.thread.Thread.this(void delegate() dg, ulong sz = cast(ulong)0)
> Failed: 'dmd' '-v' '-o-' 'threadFunctionPointerUnnamed.d' '-I.'

Hmm, right. I didn't scroll down far enough. Then I don't know.

-- 
/Jacob Carlborg
August 04, 2012
On Saturday, 4 August 2012 at 15:23:39 UTC, Russel Winder wrote:
> trial.d(7): Error: constructor core.thread.Thread.this (void function()
> fn, ulong sz = cast(ulong)0) is not callable using argument types (void
> delegate() delegate() pure nothrow @safe)
> Failed: 'dmd' '-v' '-o-' 'trial.d' '-I.'
>
> So I cannot use an anonymous delegate where I can use a named delegate?

You are trying to pass a delegate which returns a delegate – this isn't going to work. ;)

In your first example is that f is implicitly called due to the non-strict property syntax.

David
August 04, 2012
On Saturday, 4 August 2012 at 19:03:30 UTC, David Nadlinger wrote:
> In your first example is that […]

Darn, make this »In your first example, …«.
August 05, 2012
On Sat, 2012-08-04 at 21:03 +0200, David Nadlinger wrote: […]
> You are trying to pass a delegate which returns a delegate – this isn't going to work. ;)

But that is my whole point, it does a lot of the time, and it depends on whether you are working with named functions and delegates or with anonymous functions and delegates.

> In your first example is that f is implicitly called due to the non-strict property syntax.

OK, so this is looking like the nudge that anonymous was also talking about, but from a different viewpoint. It seems there is implicit behaviour going on here that is creating right royal confusion on the part of at least one programmer, me.

The parameter I think I am passing to thread construction is sometimes,
but not mostly, not the parameter the Thread constructors are receiving.
This looks like it is going to violate the Principle of Least
Surprise :-(

-- 
Russel. ============================================================================= Dr Russel Winder      t: +44 20 7585 2200   voip: sip:russel.winder@ekiga.net 41 Buckmaster Road    m: +44 7770 465 077   xmpp: russel@winder.org.uk London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder