example - createthread winapi
Implementando variables de condiciĆ³n para CRITICAL_SECTIONs para Winthreads para XP (1)
Los artículos a los que se refiere fueron escritos por colegas míos como una consecuencia de nuestro trabajo en el marco de ACE C ++ y sus fachadas de envoltura de sistema operativo. 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 cavas más profundo encontrarás que hay una capa debajo en la que un mutex se define como CRITICAL_SECTION
en las plataformas de Windows).
FYI, para asegurar que el código no haya sido 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 quiere una API C para las variables de condición, y no envoltorios C ++ a su alrededor, 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 extraer el código de allí en 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 su descarga en http://www.theaceorb.com/downloads/1.5a/index.html .
Con el interés de una 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.
Deseo las variables de condición de estilo POSIX en Win32. Tengo un código que debe ejecutarse en XP, por lo que no puedo usar CONDITION_VARIABLE
Vista / Server 2008.
Hace uso de una clase de variable pseudo-condición actualmente, que se basa en abandonar 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 sea posible. directamente He visto Estrategias para implementar variables de condición POSIX en Win32 , pero la solución "mejor" (la más correcta) usa un Mutex y no una CRITICAL_SECTION
. Hay un boceto de una implementación con una CRITICAL_SECTION
en la segunda parte , 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í?