2010-03-17 15 views
22
__thread Foo foo; 

Comment "foo" est-il réellement résolu? Est-ce que le compilateur remplace silencieusement chaque instance de "foo" par un appel de fonction? "Foo" est stocké quelque part par rapport au bas de la pile, et le compilateur stocke cela comme "hé, pour chaque thread, avoir cet espace près du bas de la pile, et foo est stocké comme" offset x du bas de la pile " "?Implémentation de stockage local de threads Linux

Répondre

26

C'est un peu compliqué (this document l'explique en détail), mais ce n'est fondamentalement ni l'un ni l'autre. Au lieu de cela, le compilateur place une section spéciale .tdata dans l'exécutable, qui contient toutes les variables locales. Lors de l'exécution, une nouvelle section de données pour chaque thread est créée avec une copie des données dans la section .tdata (en lecture seule) et lorsque les threads sont activés au moment de l'exécution, la section est également commutée automatiquement. Le résultat final est que les variables __thread sont aussi rapides que les variables normales, et qu'elles ne prennent pas non plus d'espace de pile supplémentaire.

+0

Je peux voir comment cela fonctionne si j'ai multi-threads mais un seul noyau. Quand j'ai multi-threads et multi-core, comment fonctionne cette section .tdata? – anon

+0

@anon: Quelles différences voyez-vous dans votre deuxième cas? –

+0

heure 01: le noyau 1 exécute le fil 1; permute dans le fil 1 .tdata; temps 02: le noyau 2 exécute le filetage 2; permute dans le fil 2 .tdata; Maintenant, thread1 n'est pas soudainement en utilisant .tdata de thread2? – anon