【发布时间】:2010-09-10 13:52:22
【问题描述】:
在 solaris 中,当我将 dbx 附加到正在运行的堆栈之一时,我发现对 fwrite 的调用导致 __lll_lock_wait()?
在什么情况下会发生这种情况? fwrite 是否在内部尝试获取锁?
【问题讨论】:
在 solaris 中,当我将 dbx 附加到正在运行的堆栈之一时,我发现对 fwrite 的调用导致 __lll_lock_wait()?
在什么情况下会发生这种情况? fwrite 是否在内部尝试获取锁?
【问题讨论】:
我查看的标准(C99 和 POSIX)并没有说明关于 fwrite 的锁定或解锁 IO。
在我的 linux 系统上,man 页面中的锁定不是很准确:
For non-locking counterparts, see unlocked_stdio(3).
实际上,有一个fwrite_unlocked 函数。 POSIX 中的标准解锁函数只有getc_unlocked()、getchar_unlocked()、putc_unlocked() 和putchar_unlocked()。
我的解释是,可能 man(3) 集中的所有缓冲 IO 都已锁定,并且您只有很少的标准化接口来执行解锁 IO。
这些东西在线程之间锁定确实是一件好事,否则当多个线程写入 stderr 时,您可能会得到完全混乱的输出,例如
【讨论】:
flockfile 参考页面中相当准确地描述了锁定。除了 _unlocked 之外的所有 stdio 函数必须在内部执行 flockfile/funlockfile 等效函数。
fwrite 页面上交叉引用这个。同样在stdio.h 的页面上,我现在看到所有这些都是 POSIX 中的可选功能。
FILE *。请参阅 POSIX 第 2.5 节标准 I/O 流:“所有输入的发生就像是通过连续调用 fgetc() 读取字节;所有输出都像通过连续调用 fputc() 写入字节一样发生。”这很清楚地表明,就规范而言,锁定是按字节进行的,对于交错输出没有安全性。