我的问题:在 Linux(和 FreeBsd 中,通常在 UNIX 中)是否可以/合法地从两个线程同时读取单个文件描述符?
我做了一些搜索,但一无所获,尽管很多人同时询问有关从/向套接字 fd 读取/写入的问题(意思是在其他线程正在写入时读取,而不是在其他线程正在读取时读取)。我也阅读了一些手册页,但对我的问题没有明确的答案。
为什么我问它。我试图实现一个简单的程序来计算标准输入中的行数,比如 wc -l。我实际上是在测试我自制的 C++ io 引擎的开销,发现 wc 快了 1.7 倍。我削减了一些 C++ 并接近 wc 速度但没有达到它。然后我尝试了输入缓冲区的大小,对其进行了优化,但 wc 显然还是快了一点。最后我创建了 2 个并行读取相同 STDIN_FILENO 的线程,这终于比 wc 快了!但是行数变得不正确......所以我想一些垃圾来自意外的读取。内核不关心读取什么进程吗?
编辑:我做了一些研究,发现直接通过系统调用调用 read 并没有改变任何东西。内核代码似乎做了一些同步处理,但我不太了解(read_write.c)