En Microsoft Visual C++ puedo llamar CreateThread() para crear un hilo iniciando una función con un parámetro void *
. Paso un puntero a una estructura como ese parámetro, y veo que muchas otras personas también lo hacen.C++ - ¿Deberían los datos pasados a un hilo ser volátiles?
Mi pregunta es si estoy pasando un puntero a mi estructura ¿cómo sé si los miembros de la estructura se han escrito realmente en la memoria antes de llamar a CreateThread()? ¿Hay alguna garantía de que no serán solo almacenados en caché? Por ejemplo:
struct bigapple { string color; int count; } apple;
apple.count = 1;
apple.color = "red";
hThread = CreateThread(NULL, 0, myfunction, &apple, 0, NULL);
DWORD WINAPI myfunction(void *param)
{
struct bigapple *myapple = (struct bigapple *)param;
// how do I know that apple's struct was actually written to memory before CreateThread?
cout << "Apple count: " << myapple->count << endl;
}
Esta tarde mientras estaba leyendo vi una gran cantidad de código de Windows en este sitio web y otros que pasa en datos que no es volátil a un hilo, y no parece haber ninguna memoria barrera o cualquier otra cosa. Sé que C++ o al menos las revisiones más antiguas no son "conscientes de los hilos", así que me pregunto si tal vez haya alguna otra razón. Creo que el compilador ve que he pasado un puntero & apple en una llamada a CreateThread() para que sepa escribir miembros de apple
antes de la llamada.
Gracias
Inscripción en el hilo antes de imprimir ?! –
Esto es C, no C++ ('struct bigapple *'?) –