Solaris で実行中のスタックの 1 つに dbx をアタッチすると、fwrite の呼び出しが __lll_lock_wait()? につながることがわかりました。
これはどのようなシナリオで起こりますか?fwrite は内部的にロックを取得しようとしますか?
私が調べた標準(C99およびPOSIX)は、ロックまたはロック解除されたIOについては何も述べていませんfwrite
。
man
私のLinuxシステムでは、ページのロックについてはあまり正確に言及されていません。
For non-locking counterparts, see unlocked_stdio(3).
そして効果的に、fwrite_unlocked
機能があります。POSIXの標準のロック解除された関数は、、、、、およびのみgetc_unlocked()
です。getchar_unlocked()
putc_unlocked()
putchar_unlocked()
私の解釈では、おそらくman(3)セット内のすべてのバッファリングされたIOはロックされており、ロック解除されたIOを実行するための標準化されたインターフェイスはごくわずかです。
これらのものがスレッド間でロックされることは本当に良いことです。そうしないと、複数のスレッドが書き込みを行うときに完全に乱雑な出力になる可能性があるためですstderr
。