Shared Delegates

Benjamin Thaut code at benjamin-thaut.de
Mon Oct 17 23:11:59 PDT 2011


Am 18.10.2011 08:03, schrieb Andrew Wiley:
> On Tue, Oct 18, 2011 at 12:53 AM, Benjamin Thaut <code at benjamin-thaut.de
> <mailto:code at benjamin-thaut.de>> wrote:
>
>     Am 17.10.2011 22:43, schrieb Michel Fortin:
>
>         On 2011-10-17 20:33:59 +0000, Andrew Wiley
>         <wiley.andrew.j at gmail.com <mailto:wiley.andrew.j at gmail.com>> said:
>
>
>             Okay, I realize there have been some discussions about this,
>             but I have a
>             few questions about shared delegates because right now they are
>             definitely
>             broken, but I'm not sure how.
>             Take this code example:
>
>             synchronized class Thing {
>             void doSomeWork(void delegate() work) {
>             work();
>             }
>             void work() {}
>             }
>
>             void main() {
>             auto th = new Thing();
>             th.doSomeWork(&th.work);
>             }
>
>             This doesn't compile because the type of "&th.work" is "void
>             delegate()
>             shared", which cannot be cast implicitly to "void delegate()".
>             My first question would be whether that type is correct.
>             It's true
>             that the
>             data pointer of the delegate points to a shared object, but
>             given that
>             the
>             function locks it, does that really matter in this case? I
>             guess I'm just
>             not clear on the exact meaning of "shared" in general, but
>             it seems like
>             whether the data is shared or not is irrelevant when the
>             delegate
>             points to
>             a public member of a synchronized class. If it was a
>             delegate pointing
>             to a
>             private/protected member (which should be illegal in this
>             case), that
>             would
>             not be true.
>             If that type is correct, the problem is that "void
>             delegate() shared"
>             doesn't parse as a type (there is a workaround because you
>             can create
>             variables of this type through alias and typeof).
>
>             What, exactly, is wrong here?
>
>
>         I think what's wrong is that a shared delegate should implicitly
>         convert
>         to a non-shared one. The delegate is shared since it can be called
>         safely from any thread, and making it non-shared only prevent
>         you from
>         propagating it to more thread so it's not harmful in any way.
>
>
>     I reported this exact issue already a few months ago and simply
>     didn't get any comment on it. If you really try to use shared to are
>     going to hit more such problems.
>
>     See the shared section of my blogpost:
>     http://3d.benjamin-thaut.de/?__p=18 <http://3d.benjamin-thaut.de/?p=18>
>
>
> Ah, I was looking through the bug reports and didn't see this exact bug.
> Did I just fail at searching, or should I file it?
>

I didn't file it yet, so file it. I do however think that currently 
there is no intention in changing the way shared works.

-- 
Kind Regards
Benjamin Thaut


More information about the Digitalmars-d mailing list