A classe de armazenamento static permite declarar objetos
que são inicializados apenas uma vez. Se a mesma linha
for executada uma segunda vez, a inicialização
será omitida.
Cada thread terá seu próprio objeto static (TLS - thread local storage)
e não poderá ler ou modificar o objeto static de outra thread,
embora o nome da variável
permaneça o mesmo. Assim, o static permite declarar um objeto
que mantém o estado que é global para a thread atual.
Isso é diferente de
C, C++ e Java, por exemplo, onde static de fato significa global
para o aplicativo, o que acarreta problemas de sincronização
em aplicativos com múltiplas threads.
O valor atribuído a uma variável static deve
ser avaliável em tempo de compilação. Ele não deve ter
dependências de tempo de execução! É possível inicializar
variáveis static em tempo de execução usando um construtor
único static this() para structs, classes e módulos.
static int b = 42;
// b é inicializado apenas uma vez!
// Quando executado em diferentes threads
// cada thread terá sua
// "própria" variavel b sem interferência de
// outras threads.
Além disso, para a declaração de uma variável global "clássica" que
cada thread pode ver e modificar,
use a classe de armazenamento __gshared, que é equivalente
ao static do C.
Seu nome feio é um lembrete amigável para usá-la raramente.
__gshared int b = 50;
// Também inicializado apenas uma vez!
// Um b verdadeiramente global que toda thread
// pode ler - e que o torna perigoso -
// modificar!