Jaja, también encontré este problema cuando estaba aprendiendo subprocesos múltiples y los resultados de salida eran diferentes cada vez. Más tarde descubrí el motivo: todo fue causado por múltiples núcleos.
Supongo que tu computadora también debería ser multinúcleo. Una CPU de un solo núcleo solo puede ejecutar una instrucción a la vez cuando procesa subprocesos múltiples. Es decir, no importa cuántos subprocesos tenga su programa, solo se ejecuta el código de un subproceso a la vez y la CPU lo tomará. A cada hilo se le asigna un intervalo de tiempo. A qué subproceso se le asigna el intervalo de tiempo, se ejecutará el código de ese subproceso. Pero las CPU de múltiples núcleos son diferentes. Pueden ejecutar código en varios subprocesos al mismo tiempo. Esto es un verdadero "multiproceso". Por lo tanto, su programa no debería tener problemas para ejecutarse en una computadora de un solo núcleo, pero los resultados en una computadora con CPU de múltiples núcleos serán muy aleatorios.
En cuanto a la imagen que publicaste, el tiempo de ejecución de la izquierda es así. Primero, cpu1 ejecuta el código en tu hilo principal y lo genera en la terminal. =, pero porque se están ejecutando varias CPU al mismo tiempo, y en este momento cpu2 ha comenzado a ejecutar el código en ThreadProc y a enviar caracteres al terminal, y solo tiene una pantalla En este momento, el intervalo de tiempo de cpu1. se ha eliminado, por lo que se inicia cpu2. Ejecute el código en ThreadProc y envíelo a la pantalla hasta que se imprima el segmento de tiempo de cpu2. En este momento, cpu1 imprime el valor de dwThreadId en. Aparece la pantalla y aparece 4660. Luego, es cpu2 quien termina de ejecutar el código restante en ThreadProc y escribe algunas líneas más.
Cuando el programa de la derecha se está ejecutando, sucede que después de que cpu1 ejecuta el código del hilo principal y lo genera, cpu2 ejecuta el código en la función del hilo, lo cual está en línea con sus expectativas.
Sin embargo, el problema clave es que no se puede predecir la asignación de intervalos de tiempo de cada CPU. Por lo tanto, obtener el resultado que desea es un evento aleatorio.
Para problemas de sincronización de programas en CPU multinúcleo, es mejor no utilizar semáforos, mutex y objetos de eventos, porque todos pertenecen a objetos del núcleo y son todos para una CPU. Otras CPU simplemente ignorarán estas cosas que usted configure. Además, su WaitForSingleObject (hThread, INFINITE) también está esperando que la función del hilo regrese en una CPU y no tiene ningún efecto en la CPU2;
Se recomienda utilizar una sección crítica para lograr la sincronización de subprocesos múltiples, porque la sección crítica no es un objeto del kernel, es solo un área en la memoria del proceso, sin importar cuántas CPU haya. , solo puede haber uno en cualquier momento. Cuando un hilo accede a esta área de memoria, solo necesita colocar la parte que imprime en la sección crítica.
#include "stdafx.h"
#include
#include
usando el espacio de nombres std ;
CRITICAL_SECTION g_cs;
DWORD WINAPI ThreadProc(
LPVOID lpParameter // datos del hilo
)
{
int i=0;
mientras (i<20)
{
EnterCriticalSection(&g_cs);
cout<<"Soy de un hilo"<<" "<
LeaveCriticalSection(&g_cs);
}
return 0;
}
int main(int argc, char* argv[])
{
HANDLE hThread; /p>
DWORD dwThreadId;
InitializeCriticalSection(&g_cs);
// Crear un hilo
hThread = ::CreateThread (
NULL, //Atributos de seguridad predeterminados
NULL, //Tamaño de pila predeterminado
ThreadProc, //Dirección de entrada del hilo (función que ejecuta el hilo)
NULL, // Parámetros pasados a la función
0, // Especifica el hilo que se ejecutará inmediatamente
&dwThreadId // Devuelve el número de ID del hilo
EnterCriticalSection (&g_cs);
cout<<"Ahora se ha creado otro hilo. ID ="<< dwThreadId <<"\n";
LeaveCriticalSection(&g_cs); );
//Espera a que finalice el nuevo hilo
::WaitForSingleObject (hThread, INFINITE);
::CloseHandle (hThread); p>
return 0 ;
}
ps: "Programación multiproceso Win32" traducido por Hou Jie recomendado por kdzhy2008 es de hecho un buen libro, aunque fue publicado en. 1997, muchas cosas son relevantes hasta el día de hoy.
Espero que te pueda ser útil, jaja~~