Внося изменения в класс с длинной историей, я был поставлен в тупик из-за особой привычки архитектора заключать свою последовательность va_start -> va_end в мьютекс. В журнале изменений для этого дополнения (которое было сделано около 15 лет назад и с тех пор не пересматривалось) отмечено, что это произошло из-за того, что va_start et. все было не реентерабельно.
Я не знал о таких проблемах с va_start, так как всегда думал, что это просто макрос для какой-то математики с указателем стека. Есть ли здесь что-то, о чем я не знаю? Я не хочу менять этот код, если будут побочные эффекты.
В частности, рассматриваемая функция выглядит примерно так:
void write(const char *format, ...)
{
mutex.Lock();
va_list args;
va_start(args, format);
_write(format, args);
va_end(args);
mutex.Unlock();
}
Это вызывается из нескольких потоков.
printf("foo")
иprintf("bar")
и получают"fboaor"
на выходе вместо"foobar"
или"barfoo"
. - person Mark Lakata   schedule 26.10.2012