C estática mundial - compartilhado entre threads?

votos
6

Em C, declarando uma variável estática no escopo global torna uma variável global. É este variável global compartilhada entre os tópicos ou é alocada por thread?

Update: Se eles são compartilhados entre threads, o que é uma maneira fácil de fazer globals em uma biblioteca preexistente única para uma thread / não compartilhado?

Update2: Basicamente, eu preciso usar um preexistente biblioteca C com globals de uma forma thread-safe.

Publicado 27/08/2009 em 05:28
fonte usuário
Em outras línguas...                            


3 respostas

votos
16

É visível a todo o processo, ou seja, todas as threads. Claro, isso é na prática. Em teoria, você não poderia dizer, porque tópicos têm nada a ver com o padrão C (pelo menos até c99, que é o padrão que estava em vigor quando esta pergunta foi feita).

Mas todas as bibliotecas de rosca que já usei teria globals acessíveis a todos os threads.


Update 1:

Muitas bibliotecas de rosca (pthreads, para um) lhe permitirá criar dados específicos de segmento, um meio de funções para criar e dados de uso específicos para o segmento sem tê-lo transmitida através da função.

Assim, por exemplo, uma função para retornar pseudo números aleatórios pode querer cada thread para ter uma semente independente. Assim, cada vez que é chamado-lo, ou cria ou atribui a um bloco específico da thread segurando essa semente (usando algum tipo de chave).

Isto permite que as funções para manter a mesma assinatura como os não roscados (importante se eles são funções ISO C por exemplo) uma vez que a outra solução envolve a adição de um ponteiro específico do fio para a função de chamar a si mesma.

Outra possibilidade é ter uma matriz de globals dos quais cada thread recebe um , tais como:

int fDone[10];
int idx;
: : :
for (i = 0; i < 10; i++) {
    idx = i;
    startThread (function, i);
    while (idx >= 0)
        yield();
}

void function () {
    int myIdx = idx;
    idx = -1;
    while (1) {
        : : :
    }
}

Isso permitiria que a função segmento a ser dito que variável global na matriz pertence a ele.

Existem outros métodos, sem dúvida, mas curto de conhecer o seu ambiente de destino, não há muito sentido em discuti-las.


Update 2:

A mais fácil maneira de usar uma biblioteca de não-thread-safe em um ambiente de rosca é fornecer chamadas de mensagens publicitárias com proteção mutex.

Por exemplo, digamos que a sua biblioteca tem um não-thread-safe doThis()função. O que você faz é fornecer um wrapper para ele:

void myDoThis (a, b) {
    static mutex_t serialize;
    mutex_claim (&serialize);
    doThis (a, b);
    mutex_release (&serialize);
}

O que vai acontecer lá é que apenas um thread por vez será capaz de reivindicar o mutex (e, portanto, chamar a função-non-thread-safe). Outros serão bloqueados até que o atual retornos.

Respondeu 27/08/2009 em 05:30
fonte usuário

votos
1

Como @Pax mencionado, variáveis ​​estáticas são visíveis para todos os tópicos. Não há dados construo C ++ associado com um segmento particular.

No entanto, no Windows, você pode usar o TlsAlloc API para alocar índice para uma dados específicos do segmento e colocar esse índice em uma variável estática. Cada segmento tem sua própria ranhura que você pode acessar usando este índice eo TlsGetValue e TlsSetValue. Para mais informações, leia sobre Usando Thread Local Storage no MSDN.

Atualização : Não há nenhuma maneira de fazer globals em uma biblioteca preexistente ser específico-thread. Todas as soluções exigem que você modificar o código, assim como para estar ciente de que os dados têm afinidade de segmento.

Respondeu 27/08/2009 em 05:35
fonte usuário

votos
1

Padrão C / C ++ não suporta threads. Assim, todas as variáveis compartilhadas entre threads. Suporte de thread implementado em C C ++ runtime biblioteca / que não é parte do padrão. Tempo de execução é específico para cada aplicação de C / C ++. Se você quiser escrever código portátil em C ++ você poderia usar biblioteca interprocess impulso .

Para declarar rosca variável local no Microsoft Visual Studio você pode usar Microsoft palavra-chave específica __declspec( thread ).

Respondeu 27/08/2009 em 05:34
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more