Mentre eseguivo una modifica in una classe con una lunga storia, ero ostacolato da una particolare abitudine dell'architetto di avvolgere la sua sequenza va_start -> va_end in un mutex. Il changelog per quell'aggiunta (che è stata fatta circa 15 anni fa, e non rivista da allora) ha notato che era perché va_start et. non era tutto rientranti.rientranti va_start (ecc.)?
Non ero a conoscenza di problemi di questo tipo con va_start, poiché ho sempre pensato che fosse solo una macro per una matematica con stack-pointer. C'è qualcosa di cui non sono a conoscenza? Non voglio cambiare questo codice se ci saranno effetti collaterali.
In particolare, la funzione in questione assomiglia molto a questo:
void write(const char *format, ...)
{
mutex.Lock();
va_list args;
va_start(args, format);
_write(format, args);
va_end(args);
mutex.Unlock();
}
questo è chiamato da più thread.
Se il comando _write blocca l'IO seriale a livello di byte o di livello buffer, è comunque possibile avere un blocco di livello superiore per rendere la chiamata write() più atomica. Non c'è niente di più fastidioso nell'avere 2 thread chiamate 'printf (" foo ")' e 'printf (" bar ")' e ottenendo '" fboaor "' sull'output, invece di '" foobar "' o '" barfoo "' . –