2012-01-07 28 views
13

Así que hay un list of c++11 features supported by visual studio.C++ 11 thread_local palabra clave compatible en visual studio 11

El soporte de thread_local está marcado como parcial. No pude encontrar una explicación de qué significa exactamente el soporte parcial aquí. ¿Acaso solo alias __declspec (hilo)?

Podría simplemente utilizar boost :: thread_specific_ptr, pero parece haber algunos informes que boost::thread_specific_ptr is slow. Eso puede o no ser cierto.

Específicamente deseo TLS rápido en x86/x64 en el linux más reciente + gcc y windows + msvc. Rápido significado no hay llamadas al sistema cuando sea posible (creo que esto es posible para las plataformas anteriores).

+5

La vista previa de desarrollador de Visual C++ 11 no admite la palabra clave 'thread_local'. –

+0

Según tengo entendido, "parcial" significa que la semántica es compatible, pero no a través de la sintaxis/palabra clave estándar. – ildjarn

+1

@ybungalobill O bien GNU, POSIX, Microsoft, SUN, IBM y el comité estándar de C++ proporcionaron instalaciones para algo que no es necesario en un software bien diseñado o su entendimiento es defectuoso. Pero me gustaría escuchar tu argumento. – Eloff

Respuesta

6

Así que investigué un poco sobre la semántica thread_local. la __thread de gcc y la __declspec (subproceso) de gcc tienen la misma semántica que la otra y thread_local (la inicialización dinámica a un lado, que puede o no haber llegado al estándar todavía). Así que esto realmente no es un problema para mi caso de uso. Voy a hacer una definición que alias uno o el otro atributo específico de la plataforma.

+9

Lamentablemente, el problema con estos mecanismos es que no admiten tipos que no sean POD. Cuando se termina un hilo, quiero que sus objetos TLS tengan sus destructores llamados. Ni '__thread' ni' __declspec (thread) 'pueden manejar eso. BUt si no lo necesita, este enfoque debería funcionar bien – jalf

+1

De todos modos, no obtiene construcción/destrucción no trivial de forma gratuita, así que si necesita eso hay más rendimiento (no, no es una palabra, pero debería ser) mecanismos. Fui con un contexto __thread * y luego asigné el contexto en la pila en el método de inicio de subproceso y establecí el contexto tls * para que apunte a él. Luego obtengo una construcción/destrucción adecuada y el acceso a ella debe ser casi tan rápido como sea posible. – Eloff

Cuestiones relacionadas