我有一个在macos上运行的多线程(pthread)C应用程序,我试图从具有极低延迟的命名管道读取。有很多数据写入管道(每秒数十MB),而macos只有几十KB的管道缓冲区,因此保持管道清洁非常重要。
但是,我不能让整个核心忙于重复read()
操作,因为我想将该CPU用于其他操作。
我已尝试在poll()
上等待对命名管道进行写入,然后仅在read()
事件上等待POLLIN
。这是有效的,因为我从每秒运行数百万次的循环下降到每秒一百万次。然而,它仍然是一个巨大的浪费,因为每个read()
操作只从管道中卸载平均10-20个字节。
我可以usleep()
之间的阅读,但我不喜欢这个想法(我尝试过,我不知道怎么能让它无法正常工作)。
我相信fread()
实现了一个缓冲区(你可以要求它阻止并且只在至少准备好复制n个字节时才返回),但不知怎的,我只能让它工作(等待) (对于a)少量字节,比如4个字节,而不是16或128。