Preguntas sobre hilos
Los procesos y los subprocesos son conceptos del sistema operativo. Un proceso es una instancia de ejecución de una aplicación. Cada proceso se compone de espacio de direcciones virtuales privadas, código, datos y otros recursos del sistema. Los recursos creados durante la ejecución del proceso se destruirán cuando el proceso finalice y los recursos del sistema. utilizado será destruido o liberado cuando finalice el proceso.
Un hilo es una unidad de ejecución en un proceso. Cuando el sistema crea un proceso, en realidad comienza a ejecutar el hilo principal de ejecución del proceso. El hilo de ejecución principal existe en forma de dirección de función, como la función principal o WinMain, que proporciona al sistema Windows el punto de partida del programa. Cuando termina el hilo principal de ejecución, el proceso también termina.
Cada proceso tiene al menos un hilo de ejecución principal. El usuario no necesita crearlo activamente, el sistema lo creará automáticamente. Los usuarios pueden crear otros subprocesos en la aplicación según sea necesario y se pueden ejecutar varios subprocesos simultáneamente en el mismo proceso. Todos los subprocesos de un proceso están en el espacio de direcciones virtuales del proceso y utilizan estos espacios de direcciones virtuales, variables globales y recursos del sistema. Por lo tanto, la comunicación entre subprocesos es muy conveniente y la tecnología de subprocesos múltiples también se ha utilizado más ampliamente.
El subproceso múltiple puede lograr un procesamiento paralelo para evitar que una tarea ocupe tiempo de CPU durante mucho tiempo. Una cosa a tener en cuenta es que la mayoría de las computadoras hoy en día tienen un solo procesador (CPU). Para ejecutar todos estos subprocesos, el sistema operativo programará algo de tiempo de CPU para cada subproceso individual. El sistema operativo se turnará para proporcionar intervalos de tiempo a los subprocesos. Esto da la ilusión de que todos los subprocesos se ejecutan al mismo tiempo. Se puede ver que si dos subprocesos muy activos intentan tomar el control de la CPU, el cambio de subproceso consumirá muchos recursos de la CPU, lo que reducirá el rendimiento del sistema. Esto es algo que debe tener en cuenta al realizar programación multiproceso.
Las funciones del SDK de Win32 admiten programación multiproceso y proporcionan diversas operaciones de sincronización, mutex y secciones críticas en los principios del sistema operativo. La biblioteca de clases MFC utilizada en Visual C 6.0 también implementa programación multiproceso, lo que hace que la programación multiproceso sea más conveniente.
La API de Win32 admite programación multiproceso
Win32 proporciona una serie de funciones API para completar la creación, suspensión, reanudación, terminación y comunicación de subprocesos. A continuación se muestra una selección de algunas de las funciones importantes.
1. HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);
Esta función crea un nuevo hilo en el espacio de proceso del proceso que llama y devuelve el identificador del hilo creado.
lpThreadAttributes: puntero a la estructura SECURITY_ATTRIBUTES, que determina los atributos de seguridad del subproceso, generalmente establecido en NULL
dwStackSize: especifica la profundidad de la pila del subproceso, generalmente establecida en 0;
dwStackSize: especifica la profundidad de la pila del subproceso, generalmente establecida en
lpStartAddress: la dirección de la función que ejecuta el código cuando se inicia el nuevo subproceso, es decir, el dirección inicial del hilo y la dirección inicial del hilo.
Generalmente (LPTHREAD_START_ROUTINE)ThreadFunc, ThreadFunc es el nombre de la función del subproceso;
lpParameter: especifica los parámetros de 32 bits pasados al subproceso cuando se ejecuta el subproceso, es decir, los parámetros de la función del subproceso;
dwCreationFlags: control Flag adicional creado por el hilo, que puede tomar dos valores. Si el parámetro es 0, el hilo comenzará a ejecutarse inmediatamente después de su creación; si el parámetro es CREATE_SUSPENDED, después de que el sistema genere el hilo, el hilo estará en un estado de ejecución pendiente y no se ejecutará inmediatamente hasta que la función ResumeThread sea. llamado;
lpThreadId: este parámetro devuelve el ID del subproceso que se está creando; si la creación es exitosa, se devuelve el identificador del subproceso;
dwCreationFlags: este parámetro es de 32 bits; parámetro, que es un parámetro de la función del hilo. Si la creación es exitosa, se devuelve el identificador del hilo. De lo contrario, se devuelve NULL.
2. DWORD SuspendThread(HANDLE hThread);
Esta función se utiliza para suspender el hilo especificado. Si la función se ejecuta con éxito, la ejecución del hilo finaliza.
3. DWORD ResumeThread(HANDLE hThread);
Esta función se utiliza para finalizar el estado suspendido del hilo y ejecutar el hilo.
4. VOID ExitThread (DWORD dwExitCode);
Esta función se utiliza para finalizar la ejecución del hilo en sí y se llama principalmente en la función de ejecución del hilo. El parámetro dwExitCode se utiliza para establecer el código de salida del hilo.
5. BOOL TerminateThread (HANDLE hThread, DWORD dwExitCode);
Generalmente, una vez finalizado el hilo, la función del hilo vuelve a la normalidad, pero la aplicación puede llamar a TerminateThread para finalizar un hilo por la fuerza. hilo. El significado de cada parámetro es el siguiente:
hThread: el identificador del hilo que se va a terminar;
dwExitCode: se utiliza para especificar el código de salida del hilo.
Usar TerminateThread() para finalizar la ejecución de un subproceso no es seguro y puede causar inestabilidad en el sistema; aunque esta función finalizará inmediatamente la ejecución del subproceso, no liberará los recursos ocupados por el subproceso. Por lo tanto, generalmente no se recomienda utilizar esta función.
6. BOOL PostThreadMessage(DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);Esta función coloca un mensaje en la cola de mensajes del hilo especificado.
Esta función coloca un mensaje en la cola de mensajes del hilo especificado y luego lo devuelve sin esperar a que el hilo termine de procesar el mensaje.
idThread: ID del hilo que recibe el mensaje
Msg: mensaje a enviar
wParam: parámetro de palabra asociado al mensaje
; p >lParam: parámetro largo asociado al mensaje;
Si el hilo que está a punto de recibir el mensaje aún no ha creado un bucle de mensajes, la llamada a esta función fallará.
Si el hilo a punto de recibir el mensaje no ha creado un bucle de mensajes, la llamada a la función fallará.