【发布时间】:2017-04-19 20:50:41
【问题描述】:
我有一个程序,一次有大约 200 个线程处于活动状态。当我打开一个 fd 时,我知道它是在线程之间共享的。
在/proc/[pid]/fd 中,我实际上只能看到 1 个 fd,但是在查看所有打开的文件时,使用 lsof 我可以看到每个线程都打开了该文件。 (例如,同一个文件显示 200 次,相同的 pid,不同的 tid)
这是什么原因?
另外,我需要不同的线程写入同一个文件(不同的位置)。使用这个 1 fd 线程安全吗? (对我来说没有意义,但如果文件已经每个线程打开一次,如lsof 所示,它可能是安全的)。
【问题讨论】:
-
与您的问题大多无关,但除非您拥有的大多数线程大部分时间都处于空闲状态,或者您的工作站的 CPU 内核数超过 32 个左右,否则可能有大约 200 个线程矫枉过正,实际上可能会对性能产生负面影响。线程之间的同步(如果它们写入同一个文件,是需要的)肯定会成为主要的性能抑制因素。
-
并非所有 200 个线程都在写入文件,一次只有 3 个。是的,同步是一个很大的挑战,但它是一个可扩展的系统,并且硬件可以支持它。
-
那么问题就小多了。虽然写入本身是原子的(请参阅the
writemanual page),但不能保证线程之间的顺序。我真的建议您尝试重新设计或重构,以便不超过一个线程写入一个文件。 -
哦,谢谢,错过了关于偏移设置与写入原子性有关的部分,猜猜这解决了问题。
-
@OrDinari 您可以使用
pwrite()直接写入您喜欢的任何文件偏移量而无需查找,因此您无需在每个lseek()/write()周围使用锁定方案pair - 因为如果你使用lseek()然后write(),你DO 必须锁定它。请参阅pubs.opengroup.org/onlinepubs/9699919799/functions/pwrite.html 和man7.org/linux/man-pages/man2/pread.2.html 请注意,如果您以附加模式打开文件,Linux 上的pwrite()会损坏。
标签: c++ linux file file-descriptor