我的问题: 在Linux(和FreeBsd以及通常的UNIX中),是否允许/合法同时从两个线程读取单个文件描述符?
我做了一些搜索,但没有找到任何相关内容,尽管很多人询问像读/写socket fd时同时进行读取的问题(意味着一个线程在写入时另一个线程在读取,而不是两个线程都在读取)。我也阅读了一些man手册,但没有得到清晰的答案。
为什么我会问这个问题。我尝试实现一个简单的程序来计算stdin中的行数,类似于wc -l。我实际上是在测试我自己制作的C ++ io引擎的开销,并发现wc比它快1.7倍。我精简了一些C ++代码并接近了wc的速度,但仍然达不到。然后我尝试使用输入缓冲区大小进行实验,对其进行优化,但仍然比wc明显慢一些。最后,我创建了2个线程并行读取相同的STDIN_FILENO,这样最终比wc更快!但行数统计变得不正确......所以我认为一些意外的junk出现在读取中。内核不关心哪个进程进行读取吗?
编辑:我做了一些研究,并发现直接通过系统调用调用read并不会改变任何东西。内核代码似乎会进行一些同步处理,但是我并没有完全理解(read_write.c)。