Mientras editaba una clase con una larga historia, me obsesionó el hábito particular del arquitecto de ajustar su secuencia va_start -> va_end en un mutex. El registro de cambios para esa adición (que se realizó hace unos 15 años y no se revisó desde entonces) señaló que era porque va_start et. todo no fue reentrante.¿Se reentrató va_start (etc.)?
No estaba al tanto de tales problemas con va_start, ya que siempre pensé que era solo una macro para algunas matemáticas de punteros de pila. ¿Hay algo aquí que no conozco? No deseo cambiar este código si habrá efectos secundarios.
En concreto, la función en cuestión se parece mucho a esto:
void write(const char *format, ...)
{
mutex.Lock();
va_list args;
va_start(args, format);
_write(format, args);
va_end(args);
mutex.Unlock();
}
esto se le llama desde varios subprocesos.
Si el comando _write bloquea el IO serie en un nivel de byte o en un nivel de búfer, puede que desee tener un bloqueo de nivel más alto para hacer que la llamada de write() sea más atómica. No hay nada más molesto con tener 2 hilos llamados 'printf (" foo ")' y 'printf (" bar ")' y obtener '" fboaor "' en tu salida, en lugar de '" foobar "' o '" barfoo "' . –