Shared Hell
Denis Koroskin
2korden at gmail.com
Wed Oct 28 04:43:08 PDT 2009
On Wed, 28 Oct 2009 13:17:43 +0300, Walter Bright
<newshound1 at digitalmars.com> wrote:
> Denis Koroskin wrote:
>> I've recently updated to DMD2.035 (from DMD2.031 because all the later
>> versions had issues with imports) and for the first time faced problems
>> with shared modifier.
>> I don't need shared and all my globals are __gshared (they are
>> globally unique instances that don't need per-thread copies).
>
> I don't understand. Are you running multiple threads? Are those threads
> accessing globals?
>
Yes.
> A function that accesses shared data has to put in fences. There's no
> way to have the same code deal with shared and unshared code.
>
That's frustrating. I'd like to use the same class for both cases.
> But I wonder about code that both uses global variables shared across
> threads that don't need synchronization?
You missed the point. I do the synchronization myself and I'm fine with
switching to shared (I do believe it is a nice concept). The reason I use
__gshared is because shared object were garbage-collected while still
being in use a few versions of DMD back and I had no choice but to switch
to __gshared. I hope it is fixed by now.
But I still can't make my data shared, since shared is transitive (viral).
After a few hours or work I still can't even compile my code.
> As an escape from the type system, you can always cast away the
> shared-ness.
That's the only way I have now. Casts from shared to unshared *everywhere*:
class BuildManager : BuildListener
{
synchronized void build(shared Target target)
{
// ...
_buildingThread = new shared(Thread)(&_startBuild); // creating a
new shared Thread. Yes, shared Thread, because BuildManager is global.
//_buildingThread.start(); // Error: function
core.thread.Thread.start () is not callable using argument types () shared
(cast(Thread)_buildingThread).start(); // works, but ugly, and I
don't have a reason to hijack the type system in this case
// ...
}
}
Andrei would suggest a Shared!(T) template that would wrap an unshared
type and make all methods shared. This would work, but requires full AST
manipulation capabilities (it's clearly not enough to just mark all the
members shared). What should we do until then?
More information about the Digitalmars-d
mailing list