2010-07-16 34 views
7

Se puede usar una variable CRITICAL_SECTION para obtener la exclusión mutua.¿Está bien para copiar una CRITICAL_SECTION?

Mi pregunta es: ¿admite CRITICAL_SECTION la copia? Si paso uno por valor a otro hilo, ¿puedo estar seguro de que la exclusión mutua funcionará?

No me sorprendería que la respuesta sea "no puedes hacer eso", pero sería bueno tener algún tipo de confirmación oficial. No pude encontrar una declaración de ninguna manera en la documentación.

Respuesta

1

Una búsqueda rápida a través de los encabezados revela que la estructura está definida en winnt.h, y esta definición claramente parece indicar que copiar la estructura no funcionaría.

typedef struct _RTL_CRITICAL_SECTION { 
    PRTL_CRITICAL_SECTION_DEBUG DebugInfo; 

    // 
    // The following three fields control entering and exiting the critical 
    // section for the resource 
    // 

    LONG LockCount; 
    LONG RecursionCount; 
    HANDLE OwningThread;  // from the thread's ClientId->UniqueThread 
    HANDLE LockSemaphore; 
    ULONG_PTR SpinCount;  // force size on 64-bit systems when packed 
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION; 

Dicho esto, no tengo ni idea de por qué estos contadores internos se almacenan en una estructura de espacio de usuario, es decir, lo que ocurrirá si un programa modifica estos?

+1

La documentación indica claramente que no puede modificar los contenidos de 'CRITICAL_SECTION':" El proceso tampoco debe modificar el objeto, pero debe tratarlo como lógicamente opaco ". –

+0

Por eso planteé esta pregunta. ¿Qué significa "no puedo"? No es común que los programas de usuario manipulen algo más allá de un identificador. – casablanca

+0

Si una API dice que un consumidor de la API _no debe hacer algo, eso significa que "si haces esto, todas las apuestas estarán desactivadas". –

Cuestiones relacionadas