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!