Variáveis Globais em Múltiplas Instâncias do Programa

por Fabio A. Mazzarino

Mais um que veio do Reddit. Um usuário fez uma pergunta sobre a influência em variáveis globais e estáticas entre múltiplas instâncias. Considerando a forma com que a instanciação de programas funciona na grande maioria dos sistemas operacionais, não há nenhum tipo de possibilidade de haver influência entre as variáveis de cada instância.

Vamos fazer dois programas pra comprovar essa afirmação:

Variável Global

A função fork() solicita ao sistema operacional que seja criado uma nova instância do programa, como se tivesse sido chamado a partir da linha de comando. Vamos usar essa função pra comprovar que as variáveis globais são independentes

#include <stdio.h>
#include <unistd.h>

pid_t pid;
int main() {
    pid = fork();
    printf("PID: %d\n", pid);
}

O resultado:

PID: 1054
PID: 0

A instância original recebeu o PID do novo processo criado, enquanto que a nova instância recebe 0. Colocamos o valor numa variável global, e note que não houve influência.

Variável static

Vamos trabalhar com fork também:

#include <stdio.h>
#include <unistd.h>

void printstatic(int ctup) {
    static int ctstatic = 10;
    printf("ctstatic %d\n", ctstatic);
    if (ctup)
        ctstatic++;
    else
        ctstatic--;
}

int main() {
    pid_t pid = fork();
    for (int ct = 3; ct--; ) 
        if (pid)
            printstatic(1);
        else 
            printstatic(0);
}

Neste caso a função printstatic imprime o valor da variável e incrementa ou decrementa, conforme o processo pai ou o processo filho. A saída:

ctstatic 10
ctstatic 11
ctstatic 12
ctstatic 10
ctstatic 9
ctstatic 8

Note que as primeiras linhas foram impressas pelo processo pai, crescente, e as últimas pelo processo filho, decrescente. A variável estática não sofre influência do outro processo sendo executado em paralelo.

Profissionalmente

Em alguns times a utilização de variáveis globais é restrita, e somente podem ser utilizadas em situações específicas.

O mais recomendado é utilização de variáveis estáticas, como no segundo exemplo, ou utilizar estruturas de dados que são passadas como parâmetros entre as funções.