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

¿Cómo se resuelve realmente "foo"? ¿El compilador reemplaza silenciosamente cada instancia de "foo" con una llamada a función? Es "foo" almacenado en algún lugar en relación con la parte inferior de la pila, y el compilador almacena esto como "hey, para cada hilo, tiene este espacio cerca de la parte inferior de la pila, y foo se almacena como 'desplazamiento x desde el fondo de la pila' "¿?"Implementación de almacenamiento local de subprocesos de Linux

Respuesta

26

Es un poco complicado (this document lo explica en gran detalle), pero básicamente no es ninguno de los dos. En su lugar, el compilador coloca una sección .data especial en el ejecutable, que contiene todas las variables locales de subprocesos. En tiempo de ejecución, se crea una nueva sección de datos para cada subproceso con una copia de los datos en la sección .data (solo lectura), y cuando los subprocesos se cambian en el tiempo de ejecución, la sección también se cambia automáticamente.

El resultado final es que las variables __thread son tan rápidas como las variables regulares, y tampoco ocupan espacio adicional en la pila.

+0

Puedo ver cómo funciona esto si tengo múltiples hilos pero solo un núcleo. Cuando tengo multi hilos y multi core, ¿cómo funciona esta sección .data? – anon

+0

@anon: ¿Qué diferencias ves en tu segundo caso? –

+0

tiempo 01: el núcleo 1 ejecuta el hilo 1; swaps en el hilo 1 de .data; tiempo 02: core 2 ejecuta thread 2; swaps en los hilos .data de los hilos 2; ¿Ahora no está thread1 de repente usando .tdata de thread2? – anon

Cuestiones relacionadas