Agrupación de subprocesos
Hay muchas aplicaciones que crean subprocesos que pasan mucho tiempo en estado de suspensión esperando a que se produzca un evento. Otros subprocesos pueden entrar en un estado inactivo solo para despertarse periódicamente para sondear una información de estado de cambio o actualización. La agrupación de subprocesos permite usar subprocesos de forma más eficaz proporcionando a la aplicación un grupo de subprocesos de trabajo administrados por el sistema. Al menos un subproceso supervisa el estado de todas las operaciones de espera en cola en el grupo de subprocesos. Cuando se ha completado una operación de espera, un subproceso de trabajo del grupo de subprocesos ejecuta la función de devolución de llamada correspondiente.
En este tema se describe la API del grupo de subprocesos original. La API del grupo de subprocesos introducida en Windows Vista es más sencilla, más confiable, tiene un mejor rendimiento y proporciona más flexibilidad para los desarrolladores. Para obtener información sobre la API del grupo de subprocesos actual, consulte Grupos de subprocesos.
También puede poner en cola los elementos de trabajo que no están relacionados con una operación de espera al grupo de subprocesos. Para solicitar que un subproceso del grupo de subprocesos controle un elemento de trabajo, llame a la función QueueUserWorkItem . Esta función toma un parámetro a la función a la que llamará el subproceso seleccionado en el grupo de subprocesos. No hay ninguna manera de cancelar un elemento de trabajo después de que se haya puesto en cola.
Los temporizadores de cola de temporizador y las operaciones de espera registradas también usan el grupo de subprocesos. Sus funciones de devolución de llamada se ponen en cola en el grupo de subprocesos. También puede usar la función BindIoCompletionCallback para publicar operaciones de E/S asincrónicas. Al finalizar la E/S, un subproceso del grupo de subprocesos ejecuta la devolución de llamada.
El grupo de subprocesos se crea la primera vez que se llama a QueueUserWorkItem o BindIoCompletionCallback, o cuando un temporizador de la cola de temporizador o una operación de espera registrada pone en cola una función de devolución de llamada. De forma predeterminada, el número de subprocesos que se pueden crear en el grupo de subprocesos es de aproximadamente 500. Cada subproceso usa el tamaño de pila predeterminado y se ejecuta con la prioridad predeterminada.
Hay dos tipos de subprocesos de trabajo en el grupo de subprocesos: E/S y no E/S. Un subproceso de trabajo de E/S es un subproceso que espera en un estado de espera alertable. Los elementos de trabajo se ponen en cola en subprocesos de trabajo de E/S como llamadas a procedimientos asincrónicos (APC). Debe poner en cola un elemento de trabajo en un subproceso de trabajo de E/S si se debe ejecutar en un subproceso que espera en un estado de alerta.
Un subproceso de trabajo que no es de E/S espera en los puertos de finalización de E/S. El uso de subprocesos de trabajo que no son de E/S es más eficaz que el uso de subprocesos de trabajo de E/S. Por lo tanto, debe usar subprocesos de trabajo que no sean de E/S siempre que sea posible. Los subprocesos de trabajo de E/S y no E/S no salen si hay solicitudes de E/S asincrónicas pendientes. Ambos tipos de subprocesos se pueden usar en elementos de trabajo que inician solicitudes de finalización de E/S asincrónicas. Sin embargo, evite publicar solicitudes de finalización de E/S asincrónicas en subprocesos de trabajo que no sean de E/S si podrían tardar mucho tiempo en completarse.
Para usar la agrupación de subprocesos, los elementos de trabajo y todas las funciones a las que llaman deben ser seguros para el grupo de subprocesos. Una función segura no supone que el subproceso que ejecuta es un subproceso dedicado o persistente. En general, debe evitar el uso del almacenamiento local del subproceso o realizar una llamada asincrónica que requiera un subproceso persistente, como la función RegNotifyChangeKeyValue . Sin embargo, se puede llamar a estas funciones en un subproceso dedicado (creado por la aplicación) o poner en cola a un subproceso de trabajo persistente (mediante QueueUserWorkItem con la opción WT_EXECUTEINPERSISTENTTHREAD).
Temas relacionados