2012-01-24 11 views
5

Al leer en el enrutamiento POSIX, encontré un ejemplo de datos específicos de subprocesos. Yo tenía un área de confusión en mi mente ...Datos específicos de subprocesos: ¿por qué no puedo usar un mapa estático con identificadores de subprocesos?

La interfaz de hilos específicos de los datos se ve un poco torpe, especialmente una vez que se mezclan en tener que utilizar pthread_once, los diversos inicializadores, etc.

Es ¿Hay alguna razón por la que no pueda usar un static std :: map donde la clave sea pthread_self() id y el valor de los datos esté en la segunda parte del std :: pair?

No puedo pensar en una razón por la que esto no funcionaría siempre que estuviese envuelto en un mutex, pero no veo ninguna sugerencia o algo similar que me confunda dado que suena mucho más fácil que la API provista . Sé que el enhebrado puede tener muchos catch-22 así que pensé en preguntar y ver si estaba a punto de intervenir ... ¿algo desagradable? :)

Respuesta

5

No puedo pensar en una razón por la que esto no funcionaría con tal de que estaba envuelto en un mutex

Eso en sí mismo es una muy buena razón; implementado correctamente, puede acceder a sus datos específicos de subprocesos sin para evitar que otros subprocesos creen o accedan simultáneamente a los suyos.

También hay una eficiencia general (acceso a tiempo constante, versus tiempo logarítmico si usa std::map), no hay garantía de que pthread_t tenga un ordenamiento adecuado definido y limpieza automática junto con todos los demás recursos de subprocesos.

Puede utilizar la palabra clave thread_local de C++ 11, o boost::thread_specific_ptr, si no le gusta la API de Posix.

+0

+1, gracias por las palabras clave de C++ 11, disfrutaré de usarlas cuando me coloque en un proyecto que lo admita :) –

3
  1. pthread hilo específica-datos existía antes de los recipientes de la biblioteca estándar
  2. hilo específica-datos evita la necesidad de bloqueo y hace que no haya otros líos hilo con los datos
  3. se limpia Los datos automáticamente cuando el hilo desaparece

Habiendo dicho eso, nada le impide usar su propia solución. Si puede estar seguro de que el contenedor está completamente construido antes de que se ejecute algún subproceso (modelo de subprocesamiento estático), ni siquiera necesita el mutex.

+0

Además, pthread es una API, no C++ – nos

Cuestiones relacionadas