[static] [shared] [const|immutable]
Christopher Wright
dhasenan at gmail.com
Thu May 14 04:22:55 PDT 2009
Lionello Lunesu wrote:
>
> "Christopher Wright" <dhasenan at gmail.com> wrote in message
> news:gugs7b$70p$1 at digitalmars.com...
>> Lionello Lunesu wrote:
>>> I like shared/const/immutable as much as the next guy, but there are
>>> now 2x2x3=12 ways to decorate a variable. Furthermore, by either
>>> declaring the variable globally or locally (stack), we end up with 24
>>> possible declaration. See the code at the end of this post.
>>
>> The decision to make a variable a static class or module member is
>> independent of whether to make it shared or not.
>
> You're right, of course. I realize now that "static" is a storage class
> (when used locally) not a type modifier.
>
>> Shared and const-level have to do with controlling access to the
>> variable.
>>
>> An immutable variable does not need to be declared shared.
>
> So, immutable implies shared.
Immutable is threadsafe. Shared implies automatic locking, I believe;
immutable variables do not need any locking.
>> Shared const is for publish-subscribe sort of deals.
>
> You mean one thread can change the value, but for another thread it's
> constant? I can see how it would be useful using reference types, but I
> don't understand how it would work with value types..
Shared const doesn't really work for value types; it ends up being the
same as immutable. Unless you have a mutable pointer to the value, in
which case you can write to the value through that pointer. That is not
safe -- the compiler is free to see that this variable is const and a
value type, which means you can't ever write to it, and then put it in
read-only memory.
Const that doesn't boil down to immutable works a fair bit better with
object-oriented code. You wrap your value in a class, create a mutable
instance, and send it to a bunch of other functions or objects or
threads expecting a const object. They can't use the mutators, but they
can use the accessors.
>> Shared mutable is for cooperative writing to the variable.
>
> This one I understood :)
>
>> The point of a shared local variable is to pass it to another thread
>> or set of threads, which will then be able to mutate it without trouble.
>
> As before, how can an int (value type) on the stack ever be shared with
> another thread? It would always have to be copied... Can you give me an
> example please?
By reference.
int i;
shared int* j = &i;
sendToManyThreads(j);
More information about the Digitalmars-d-learn
mailing list