【发布时间】:2011-04-21 09:52:24
【问题描述】:
在对具有悠久历史的类进行编辑时,我被架构师的一个特殊习惯所阻碍,即把他的 va_start -> va_end 序列包装在互斥体中。该添加的更改日志(大约 15 年前制作,此后未修订)指出这是因为 va_start 等。 all 都不是可重入的。
我不知道 va_start 有任何此类问题,因为我一直认为它只是一些堆栈指针数学的宏。这里有什么我不知道的吗?如果有副作用,我不想更改此代码。
具体来说,有问题的函数看起来很像这样:
void write(const char *format, ...)
{
mutex.Lock();
va_list args;
va_start(args, format);
_write(format, args);
va_end(args);
mutex.Unlock();
}
这是从多个线程调用的。
【问题讨论】:
-
如果 _write 命令将串行 IO 锁定在字节级别或缓冲级别,您仍可能希望拥有更高级别的锁定以使 write() 调用更具原子性。有 2 个线程调用
printf("foo")和printf("bar")并在您的输出上获得"fboaor"而不是"foobar"或"barfoo",没有什么比这更烦人的了。