2011-01-29 19 views
8

Kiedy nie używany wewnątrz kontekście static (to znaczy, gdy słowo kluczowe static nie jest obecny, a nie jesteś w zasięgu globalnym), co robią i shared__gshared słowa kluczowe zrobić?„wspólna” i „__gshared” Keywords D

Przykłady:

struct Temp 
{ 
     shared int i; 
    __gshared int j; 
} 

Odpowiedz

4

Wspólna int jest wpisane shared(int), który nie zrobić nic ale nadać mu tego typu. The __gshared int jest no-op - DMD lubi ignorować atrybuty no-op.

+0

Innymi słowy, oba są bezcelowe? – Mehrdad

+4

__gshared nie jest no-op. To implikuje statyczne. – dsimcha

+3

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

1

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.