Thread-local storage

Thread-local storage (TLS) nada mais é do que um método para tornar local para uma thread uma variável global ou estática. As vezes isto é necessário, como toda variável global e estática compartilham o mesmo endereço em cada thread em um processo. Diversas linguagens fornecem meios de tratar tal situação, vejamos como sanar esta questão em C usando o GCC.

No GCC, basta usarmos a storage class __thread, veja:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
 
/* Com esta storage class __thread nós indicamos que esta variável global
 * não deverá ter seu endereço compartilhado em uma thread */
__thread int foo = 1;
 
/* Já esta, terá seu endereço compartilhado */
int bar = 1;
 
void *increment(void *ptr)
{
	printf("[ %d ][ %d ]\n", foo++, bar++);
 
	return NULL;
}
 
int main(int argc, char **argv)
{
	int i;
	pthread_t thread[5];
 
	for (i = 0; i < 5; i++) {
		pthread_create(&thread[i], NULL, increment, NULL);
	}
 
	for (i = 0; i < 5; i++) {
		pthread_join(thread[i], NULL);
	}
 
	return 0;
}

E então...

$ gcc -o teste -lpthread teste.c
$ ./teste
[ 1 ][ 1 ]
[ 1 ][ 2 ]
[ 1 ][ 3 ]
[ 1 ][ 4 ]
[ 1 ][ 5 ]

Algumas informações obtidas na documentação do GCC:

Algumas regras do GCC quanto a utilização seguem abaixo:
- O especificador __thread pode ser usado sozinho, com os especificadores extern ou static, mas sem outro especificador. Quando usado com extern ou static, ele precisa aparecer em seguida.

- O __thread pode ser aplicado para qualquer global, estática no escopo do arquivo, estática do escopo de função, ou como membro estático de uma classe. Ele não pode ser aplicado para uma variável automática do escopo de um bloco ou em membro não-estático.

Quando o operador address-of é aplicado para uma variável local de thread, ele é avaliado em run-time e retorna o endereço da instância da thread atual da variável. O endereço obtido pode ser usado por qualquer thread. Quando uma thread termina, qualquer ponteiro para uma váriavel local de thread nesta thread torna-se inválida.

Veja também...

http://en.wikipedia.org/wiki/Thread-local_storage
http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html
http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/Thread-Local.html

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options