我最近了解到getchar_unlocked()比正常的io操作(例如scanf或cin)更快,但是这使得它的速度更快。线程不安全在这种情况下意味着什么?
答案 0 :(得分:2)
将getchar_unlocked
(或普通getchar
)与cin
或scanf
进行比较不是苹果对苹果:getchar
功能从缓冲区中获取单个字符并将其返回给您,而基于流和格式的函数首先需要通过解释当前状态或格式字符串来决定返回什么,然后才将其返回给您。
getchar_unlocked
应与getchar
进行比较。如果你多次调用它可能会更快,例如来自紧密循环,因为它允许您在每个循环中锁定和解锁流缓冲区一次,而不是每循环迭代一次。
为了安全地读取输入流,您需要在读取之前将其锁定。当您拨打getchar
时,会执行以下操作:
flockfile(fileptr)
getc_unlocked(fileptr)
funlockfile(fileptr)
如果您循环拨打十次,则会看到十次拨打flockfile
,十次拨打getc_unlocked
,十次拨打funlockfile
。如果您知道自己正在阅读10个字符,则可以拨打flockfile
一次,拨打10个电话getc_unlocked
,然后拨打funlockfile
。这样可以节省9次对每个flock / funlock函数的调用。