subproceso

Específicos de Microsoft

El modificador de clase de almacenamiento extendida thread se usa para declarar una variable local de subproceso.

__declspec( thread ) declarator

Comentarios

El almacenamiento local de subprocesos (TLS) es el mecanismo por el que cada subproceso de un proceso con varios subprocesos asigna almacenamiento para los datos específicos de ese subproceso. En los programas multiproceso estándar, los datos se comparten entre todos los subprocesos de un proceso dado, mientras que el almacenamiento local de subprocesos es el mecanismo para asignar datos por subproceso. Para obtener un análisis completo de los subprocesos, vea Multithreading.

Las declaraciones de variables locales de subproceso deben utilizar la sintaxis de atributos extendida y la palabra clave __declspec con la palabra clave thread. Por ejemplo, el código siguiente declara una variable local de subproceso de entero y la inicializa con un valor:

__declspec( thread ) int tls_i = 1;

Debe seguir estas instrucciones cuando declare objetos y variables locales de subproceso:

  • Solo puede aplicar el atributo thread a las declaraciones y definiciones de datos y a las clases que no tienen funciones miembro; thread no se puede utilizar en declaraciones o definiciones de función.

  • El uso del atributo thread puede interferir con la carga de retraso de importaciones de DLL**.**

  • Solo puede especificar el atributo thread en elementos de datos con duración de almacenamiento estática. Entre estos se incluyen objetos de datos globales (tanto static como extern), objetos estáticos locales y miembros de datos estáticos de clases. No puede declarar objetos de datos automáticos con el atributo thread.

  • Debe utilizar el atributo thread para la declaración y definición de un objeto local de subproceso, tanto si la declaración y la definición se realizan en el mismo archivo como en archivos distintos.

  • No puede usar el atributo thread como modificador de tipo.

  • Solo se pueden crear instancias de clases POD con __declspec(thread). El atributo thread se omite si no se declara ningún objeto como parte de la declaración de clase. Por ejemplo:

    // declspec_thread.cpp
    // compile with: /LD
    __declspec(thread) class X
    {
    public:
       int I; 
    } x;   // x is a thread object
    
    X y;   // y is not a thread object
    
  • Como la declaración de objetos que usan el atributo thread está permitida, los dos ejemplos siguientes son semánticamente equivalentes:

    // declspec_thread_2.cpp
    // compile with: /LD
    __declspec( thread ) class B {
    public:
       int data;
    } BObject;   // BObject declared thread local.
    
    class B2 {
    public:
       int data;
    };
    __declspec( thread ) B2 BObject2;   // BObject2 declared thread local.
    
  • El estándar de C permite la inicialización de un objeto o de una variable con una expresión que contenga una referencia a sí misma, pero solo para objetos cuyo tamaño no sea estático. Aunque, generalmente, C++ permite esa inicialización dinámica de objetos con una expresión que contenga una referencia a sí misma, este tipo de inicialización no se permite con objetos locales de un subproceso. Por ejemplo:

    // declspec_thread_3.cpp
    // compile with: /LD
    #define Thread __declspec( thread )
    int j = j;   // Okay in C++; C error
    Thread int tls_i = sizeof( tls_i );   // Okay in C and C++
    

    Tenga en cuenta que una expresión sizeof que incluye el objeto que se está inicializando no representa una referencia a sí misma y se permite en C y en C++.

FIN de Específicos de Microsoft

Vea también

Referencia

__declspec

Palabras clave de C++

Conceptos

Almacenamiento local de subprocesos (TLS)