TLS(タスクローカルストレージ)は、どのスレッドも同じ名前を使いながらも
、実際に格納される値は、スレッド毎に独立して保持できる領域を指す。
そこで、下記のソースで検証してみた。
TLS example
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define THREADS 3
__thread int tls;
int global;
void *func(void *arg)
{
int num = (int) arg;
tls = num;
global = num;
sleep(1);
printf("Thread=%d tls=%d global=%d\n", num, tls,global);
}
int main()
{
int ret;
pthread_t thread[THREADS];
int num;
for(num = 0; num < THREADS; num++){
ret = pthread_create(&thread[num], NULL, &func, (void*)num);
if(ret){
printf("error pthread_create\n");
exit(1);
}
}
for(num = 0; num < THREADS; num++)
{
ret = pthread_join(thread[num], NULL);
if(ret){
printf("erro pthread_join\n");
exit(1);
}
}
}
コンパイル
$gcc -Wall -g -o tls tls.c -lpthread
$./tls
結果
Thread=0 tls=0 global=2
Thread=1 tls=1 global=2
Thread=2 tls=2 global=2
確かに、スレッド毎にtlsの値が保持されている。