Domyślnym D2 jest wątek lokalnej pamięci masowej, a C, C++ i D1 - domyślną pamięcią globalną.
Jedną z różnic jest to, że zmienna globalna w D jest widoczna dla innych wątków, podczas gdy TLS nie jest.
To może nie brzmieć dużo, ale spróbuj połączyć się z biblioteką C, nie zdając sobie z tego sprawy. (niezmienny jest także globalny)
IME __gshared praktycznie istnieje tylko po to, aby wymusić coś na globalnym, gdy normalnie by nie było.
mogą być inne zastosowania, ale nie widziałem żadnych.
Przykładem może być zmienna globalna w nagłówku C. Jeśli spróbujesz połączyć się z nim, będziesz potrzebować niezmiennego lub __gshared. Oczywiście są inne sposoby, ale jest to prawdopodobnie najłatwiejsze.
Innymi słowy, oba są bezcelowe? – Mehrdad
__gshared nie jest no-op. To implikuje statyczne. – dsimcha
Ponadto: podczas gdy 'shared int' zachowuje się tylko jak kwalifikator typu (np. Jak' const') w bieżącej implementacji dmd dla zmiennych lokalnych, poprawnie zaimplementowany 'shared' - tak jak go rozumiem - powinien mieć read-acquire i write-release-semantics (tzn. użyj zapór pamięci na wielu architekturach i unikaj pewnych optymalizacji kompilacji, zobacz także http://www.digitalmars.com/d/2.0/faq.html#shared_memory_barriers). Czasami byłoby to istotne nawet dla zmiennych lokalnych, np. W przypadku zamknięcia wykonanego w innych wątkach (lub w rzadkim przypadku dostępu do stosu z wieloma wątkami). – stephan