Pregunta

El nombramiento de esta función parece que esto es un poco de materia complicada pasando. ¿Cuándo exactamente uno sabe que este es el camino a seguir en vez de hacer algo como esto:

Preparación     CRITICAL_SECTION cs;     int * p = malloc (sizeof (int)); // Asignación del sitio     InitializeCriticalSection (y cs); // pista para Escribir

Tema # 1      {     * P = 1; // Escribir     }

Tema # 2      {     EnterCriticalSection (y cs);     * P = 2; // Segundo Comentario     LeaveCriticalSection (y cs);     }

Tengo una escritura que se hace en un hilo:

Run()
{
// some code
m_bIsTerminated = TRUE;
// some more code
}

A continuación, tengo una lectura que se hace en otro hilo (potencialmente al mismo tiempo):

Terminate()
{
// some code
if( m_bIsTerminated )
{
m_dwThreadId = 0;
m_hThread = NULL;
m_evExit.SetEvent();
return;
}
// even more code
}

¿Cuál es la mejor solución para resolver esta condición carrera? Son secciones críticas el camino a seguir, o es el uso de InterlockedExchangeAdd () más útil?

¿Fue útil?

Solución

InterlockedExchangeAdd se utiliza para añadir un valor a un entero como una operación atómica, lo que significa que no tendrá que utilizar una sección crítica. Esto también elimina el riesgo de un punto muerto si uno de sus hilos se emite una excepción -. Que necesita para asegurarse de que usted no mantiene ningún bloqueo de cualquier tipo, ya que ello evitar que otros hilos para adquirir esa cerradura

Por su escenario definitivamente se puede utilizar una función Interlocked ...-, pero yo usaría un evento (CreateEvent, SetEvent, WaitForSingleObject), probablemente porque a menudo me encuentro necesidad de esperar a más de un objeto (se puede esperar de cero segundos en el escenario).

UPD: Usando volátil para la variable puede trabajar, sin embargo, no se recomienda, ver: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2016.html y http://www-949.ibm. com / software / racional / café / blogs / CCPP-paralelo-multinúcleo / etiquetas / c% 2B% 2B0x por ejemplo.

Si quieres ser portátil, echar un vistazo a boost :: hilo .

Otros consejos

En su caso, no hay ninguna condición de carrera. La variable no se restablece de nuevo a FALSO, ¿verdad? Es sólo un interruptor "por favor morir" para el hilo, ¿verdad? Entonces no hay necesidad para la sincronización de ningún tipo.

La familia InterlockedXXX de funciones atómicas hace uso de comandos de 3 operandos de la CPU Intel (xadd y CMPXCNG). Por lo que son mucho más baratos que una sección crítica. Y el que desee para la asignación de flujos seguros es InterlockedCompareExchange ().

UPD:. Y la marca de la variable como volátil

Asegúrese de que m_bIsTerminated se marca como volátil, y que debe estar bien. Aunque parece bastante raro para mí que habías // algo más de código después de ajustar "está terminado" true. ¿Qué hace exactamente indican que la variable?

Su "condición de carrera" es que sus diversos elementos de // más código pueden ejecutar en diferentes órdenes. La variable no ayuda a eso. ¿Su objetivo es conseguir que se ejecutan en un orden determinista? En caso afirmativo, se necesitaría una condición variable que esperar en un hilo y poner en otro. Si usted simplemente no quiere que ejecutar simultáneamente, una sección crítica estaría bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top