Problems with Mutex

ketmar via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Oct 26 17:13:38 PDT 2014


On Mon, 27 Oct 2014 02:07:09 +0200
ketmar via Digitalmars-d-learn <digitalmars-d-learn at puremagic.com>
wrote:

> > Thank you for clearing this up. If I understand correctly, 
> > __gshared is more of a hack to get C-like global variables, 
> > whilst shared is typed shared variable and more preferred?
> yes and no. 'shared' is the part of the type, while '__gshared' is
> not. i.e.
> 
>   shared int a;
>   pragma(msg, typeof(a)); // this will print "shared(int)"
> 
>   __gshared int b;
>   pragma(msg, typeof(b)); // this will print "int"
> 
> you can't freely mix shared and non-shared types, so you must cast
> 'shared' away on occasion and cast it back when necessary. this is not
> safe and error-prone.
> 
> '__gshared', for the other side, doesn't influence the type, so you
> can have global variable which can be passed to other functions
> without casting.
> 
> but yes, generally this is a hack, and you'd better avoid '__gshared'
> in idiomatic D code unless you are really really know what you are
> doing and what consequences it may have. ;-)
here is some silly code to show you some difference between 'shared'
and '__gshared':

  void foo (ref int i) {}

  int a;
  shared int b;
  __gshared int c;

  void main () {
    foo(a); // this compiles
    foo(b); // this will not compile (see below)
    foo(c); // this compiles too
  }

`foo(b);` will not compile, compiler emits error:
"Error: function y01.foo (ref int i) is not callable using argument
types (shared(int))"

if you'll change `foo` to `void foo (ref shared int i) {}`, you'll get
the opposite: `foo(a)` and `foo(c)` will be refused by compiler.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://lists.puremagic.com/pipermail/digitalmars-d-learn/attachments/20141027/33481f14/attachment.sig>


More information about the Digitalmars-d-learn mailing list