2009-08-02 10 views
10

Deseo las variables de condición de estilo POSIX en Win32. Tengo un código que necesita ejecutarse en XP, por lo que no puedo usar el CONDITION_VARIABLE de Vista/Server 2008.Implementando variables de condición para CRITICAL_SECTIONs para Winthreads para XP

Hace uso actualmente de una clase de variable de pseudo condición, que se basa en salir de la sección crítica y señalar un evento de reinicio automático para la señalización/vigilia. Para esperar en la variable de condición, deja la sección crítica, WaitForSingleObject s en el evento, y luego vuelve a entrar en la sección crítica. Esto está muy bien, pero no es compatible con la transmisión, y puede tener otros problemas con respecto a la equidad, que no me importa demasiado.

Usamos boost, así que sé que podría usar boost threads o pthreads-win32, que soportan variables de condición, pero idealmente me gustaría que la interfaz sea tal que pueda incluir la implementación de Microsoft cuando/si se vuelve posible usarlo directamente. He visto Strategies for Implenting POSIX Condition Variables on Win32, pero la solución "mejor" (la más correcta) usa un Mutex y no un CRITICAL_SECTION. Hay un boceto de una implementación con CRITICAL_SECTION en el second part, pero no está completo, y las otras soluciones con CRITICAL_SECTION me preocupan debido a las preocupaciones que se describen en el artículo.

En resumen, ¿cómo implemento una variable de condición correcta, no necesariamente justa (pero que sería agradable) en win32 para secciones críticas, de modo que pueda pasar a la implementación de Microsoft cuando esté disponible para mí?

Respuesta

6

Los documentos a los que se refiere fueron escritos por colegas míos como una consecuencia de nuestro trabajo en el marco de trabajo ACE C++ y sus fachadas de contenedor SO. Como mencioné en mi biografía, "No uso Windows", pero todavía trabajo activamente en ACE, y acabo de echar un vistazo, y parece que la implementación de la variable de condición para Win32 usa CRITICAL_SECTION (en la inspección inicial parece que es simplemente usando un mutex, pero si profundizas más encontrarás que hay una capa debajo en la que un mutex se define como CRITICAL_SECTION en plataformas de Windows).

FYI, para asegurar que el código no se haya modificado para usar las nuevas API Vista, la base de código que revisé es en realidad una rama fuera de la línea 1.5.

Suponiendo que solo desea una API C para variables de condición y no envoltorios C++, todo esto debe estar en un conjunto de archivos: ace/OS_NS_Thread.{h,inl,cpp} La licencia en ACE es muy generosa, y no GPL, por lo que puede extrae el código desde allí a la base de código propietario sin temor a "contaminación GPL".

Puede obtener lanzamientos de ACE en http://download.dre.vanderbilt.edu/; la versión que inspeccioné es una versión compatible comercialmente derivada de ACE 5.5.2, mantenida por OCI y disponible para descargar al http://www.theaceorb.com/downloads/1.5a/index.html.

Con el interés de la divulgación completa, he sido un usuario/colaborador/mantenedor por mucho tiempo de ACE, trabajé en ese personal de investigación por un tiempo, y ahora soy un empleado de OCI. No creo que cambie la utilidad/aplicabilidad de este código para usted, ni ninguna de las entidades mencionadas obtiene ingresos de su código de elevación de la fuente.

+0

Se ve bien! Muchas gracias. –

Cuestiones relacionadas