1

在 solaris 中,当我将 dbx 附加到正在运行的堆栈之一时,我发现对 fwrite 的调用导致了 __lll_lock_wait()?

在什么情况下会发生这种情况?fwrite 是否在内部尝试获取锁?

4

1 回答 1

2

我查看的标准(C99 和 POSIX)并没有说明关于fwrite.

在我的 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,例如

于 2010-09-10T14:10:09.787 回答